为啥“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 的值在没有收到任何东西的情况下会发生变化?

【问题讨论】:

因为您更改了yy 只是x。要复制一个值,您需要实际复制它y = copy.deepcopy(x) 但这对我来说没有意义,例如,如果我把 x = 3, y = x 和 y+= 5,x 的值不会改变 这种奇怪的行为适用于列表,而不适用于整数。这就是为什么 x = 3... 的行为符合您的预期。 y += 5 就像y = y + 5y + 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中的值会发生变化? [复制]

为啥我的数组值会发生变化? [复制]

为啥是“$”的值?在“如果”条件下发生了变化?

为啥滚动后我的单元格中的图标会发生变化? [复制]

Python - 为啥通过值传递的 ndarray 在函数外部发生变化? [复制]

为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]