为啥“x”的值发生了变化? [复制]
Posted
技术标签:
【中文标题】为啥“x”的值发生了变化? [复制]【英文标题】:why did the value of "x" change? [duplicate]为什么“x”的值发生了变化? [复制] 【发布时间】:2017-11-09 13:03:57 【问题描述】:这是我的代码:
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
的值在没有收到任何东西的情况下会发生变化?
【问题讨论】:
因为您更改了y
而y
只是x
。要复制一个值,您需要实际复制它y = copy.deepcopy(x)
。
但这对我来说没有意义,例如,如果我把 x = 3, y = x 和 y+= 5,x 的值不会改变
这种奇怪的行为适用于列表,而不适用于整数。这就是为什么 x = 3... 的行为符合您的预期。
y += 5
就像y = y + 5
。 y + 5
创建一个新值,然后将其分配给 y
。在这种情况下,不会创造新的价值;你只是在修改同一个列表。
@rosh 谢谢!我明白了
【参考方案1】:
当你放:
y = x
x 所做的只是充当指向内存中列表对象的指针。当您执行上述操作时,您是在说我希望 y 指向 x 在内存中引用的同一个列表。 y 的任何地方变化也会影响 x。
如果您希望引用 y 指向内存中的不同对象(与 x 具有相同的值),您需要制作 x 的副本。
y = x[:] #make a copy. SEE EDIT
现在 y 和 x 将指向内存中不同的列表对象,但两个对象将具有相同的值。
请注意,python 中的任何可变数据类型都共享此引用属性,例如:集合、字典、列表、字节数组以及一些类。
查看 python 中可变和不可变数据类型之间的区别,因为这种区别很关键,并且会在不了解 python 如何访问不同数据类型的情况下导致无法诊断的错误。
编辑!!
抱歉,我没有注意到 x 是由一系列列表组成的。您需要使用 deepcopy 来复制嵌套列表!
from copy import deepcopy
y = deepcopy(x)
【讨论】:
我将 y = x 更改为 y = x[:] 但它不起作用 检查编辑。【参考方案2】:当你写作时:
y = x
您实际上是在说x
等于y
。这不会复制x
。无论你对x
做什么,y
都会发生,反之亦然。如果您希望他们独立,您需要复制x
。
【讨论】:
如何复制?我试过y = x[:]和y = list(x),但是都失败了,x的值还在变化以上是关于为啥“x”的值发生了变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java - 为啥在java中的poll方法之后PriorityQueue中的值会发生变化? [复制]