关于python:为什么“x”的值会改变?

why did the value of “x” change?

本问题已经有最佳答案,请猛点这里访问。

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
x = [[1],[1],[1],[-1]]
a = [[-2,-1,-1,-2],[1,-2,2,-1],[-1,-2,-2,-1],[2,-1,1,-2]]
h = 0.1
def K(h,a,x):
    cont = [1,2,3,4]
    k = []
    for i in range(len(cont)):
        k.append(h*cont[i])
    y = x
    print('original value',x)
    for j in range(len(y)):
        y[j][0] += k[j]/4
        print('modified value',x)
K(h,a,x)

所以问题是,如果没有收到任何东西,那么为什么x的值会发生变化?


当你放:

1
y = x

X所做的就是充当内存中列表对象的指针。当你做上面的操作时,你是说我希望Y指向内存中X引用的同一个列表。对y的任何位置更改也会影响x。

如果希望引用y指向内存中的另一个对象(具有与x相同的值),则需要复制x。

1
y = x[:] #make a copy.  SEE EDIT

现在Y和X将指向内存中不同的列表对象,但这两个对象的值相同。

请注意,python中的任何可变数据类型都共享此引用属性,例如:集合、字典、列表、字节数组以及一些类。

查看python中可变数据类型和不可变数据类型之间的区别,因为这种区别非常重要,并且会导致无法识别的错误,而不知道python如何访问不同的数据类型。

编辑!!

抱歉,我没有注意到X是由一系列列表组成的。您需要使用deepcopy来复制嵌套列表!

1
2
from copy import deepcopy
y = deepcopy(x)


当你写:

1
y = x

你的字面意思是x等于y。这不会复制x。无论你对x做什么,都会发生在y上,反之亦然。如果你想让x独立,你需要复制一份。