关于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的值会发生变化?

  • 因为你换了yy只是x。要复制一个值,您需要实际复制它y = copy.deepcopy(x)
  • 但是对我来说没有意义,例如,如果我把x=3,y=x和y+=5,x的值就不会改变。
  • 这种奇怪的行为适用于列表,而不是整数。这就是为什么x=3…按你的期望行事。
  • y += 5y = y + 5相似。y + 5创建一个新值,然后将其分配给y。在这种情况下,不会创建新的值;您只是在修改同一个列表。
  • @Danielfang我昨天回答了一个类似的问题:stackoverflow.com/a/44401491/5393381您可能想看看。另外,y+=5不适用于整数。对于整数,它只是y = y + 5的一个简短形式。
  • @朱利安琴富戈斯:那是非常误导人的。整数是不可变的,并且y = y + [5]不会更改列表y
  • @Danielfang一般来说,您可以避免进行所有就地更改,只需使用理解创建新值并返回它们:gist.github.com/mseifert04/cf526882db94bf0cb9f428a9a738814
  • 所以,它只发生在列表中,如果我对整数做同样的操作,就没有问题了,对吗?
  • 不,几乎所有不明确不变的事情都会发生。更重要的是,数字(也包括字符串)是例外。
  • @mseift i将y=x改为y=x[:]但不起作用
  • 我知道这不管用。我已经给了你两个有效的解决方案。就用其中一个。
  • 检查我的编辑,我发现了问题
  • @我还尝试了y=copy.deepcopy(x),但它说"名称错误:名称‘copy’未定义"
  • @rosh i put y=deepcopy(x),但会导致名称错误:未定义名称"deepcopy"
  • 你需要导入它,"从拷贝导入deepcopy",把它放在顶部,它就会工作。
  • 谢谢!我得到了它
  • 没问题,非常容易错过。如果你能接受我的回答,我将不胜感激。


当你放:

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)

  • 我把y=x改为y=x[:]但不起作用
  • 检查编辑。


当你写:

1
y = x

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

  • 我怎样才能复制它?我试过y=x[:]和y=list(x),但都失败了,x的值还在变化