这是我的代码:
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
的价值在没有收到任何东西的情况下会发生变化?
答案 0 :(得分:1)
当你把:
y = x
所有x正在执行的操作是作为指向内存中列表对象的指针。当你执行上述操作时,你说我希望y指向内存中x引用的相同列表。任何更改为y的更改也会影响x。
如果您希望将引用y指向内存中的其他对象(与x具有相同的值),则需要复制x。
y = x[:] #make a copy. SEE EDIT
现在y和x将指向内存中的不同列表对象,但两个对象将具有相同的值。
请注意,python中的任何可变数据类型都共享此引用属性,例如:sets,dictionaries,lists,byte arrays以及某些类。
查看python中可变数据类型和不可变数据类型之间的差异,因为这种区别很关键,如果不知道python如何访问不同的数据类型,就会导致不可忽视的错误。
修改!! 强>
抱歉,我没有注意到x是由一系列列表组成的。您需要使用deepcopy来复制嵌套列表!
from copy import deepcopy
y = deepcopy(x)
答案 1 :(得分:0)
当你写:
y = x
你真的说x
等于y
。这不会复制x
。无论你对x
做什么都会发生在y
,反之亦然。如果您希望它们是独立的,您需要复制x
。