Python a=b似乎是相同的,而不是副本。为什么?

Python a=b似乎是相同的,而不是副本。为什么?,python,arrays,numpy,copy,Python,Arrays,Numpy,Copy,你好,Python/iPython用户 我发现python使用numpy数组时有一种奇怪的行为。我自己找到了解决问题的办法,但我很想得到一个解释。提前谢谢 问题是: 我使用ipython创建了一个numpy数组a和a的一个副本,称为b: import numpy as np a=np.zeros(5) b=a 然而,b似乎是a的身份,而不是副本,因为更改b也会更改a b[0]=1 a array([ 1., 0., 0., 0., 0.]) 解决方案是使用b=a.copy()而不是b

你好,Python/iPython用户

我发现python使用numpy数组时有一种奇怪的行为。我自己找到了解决问题的办法,但我很想得到一个解释。提前谢谢

问题是: 我使用ipython创建了一个numpy数组a和a的一个副本,称为b:

import numpy as np
a=np.zeros(5)
b=a
然而,b似乎是a的身份,而不是副本,因为更改b也会更改a

b[0]=1
a
array([ 1.,  0.,  0.,  0.,  0.])

解决方案是使用
b=a.copy()
而不是
b=a
,但我想了解python中为什么会出现这种情况。我非常熟悉Matlab、R和Fortran,以前从未遇到过这样的问题。为什么有人希望为相同的数据使用第二个名称,而不是该向量的副本?只是一些特定于python的语法,或者还有更多需要理解的地方吗?

这只是python的一个惯例。所有指定都只会为现有对象创建新句柄。这是一个非常合理的规则,因为它保持了语义的简单和透明;在其他语言中,您可能经常想知道是修改现有对象,还是创建新对象的句柄。如果您不想在现有对象上使用新名称,python总是强制您将其显式化。至于为什么要这样做:尝试查找任何一段python代码,看看它包含多少赋值语句。显然,它是有用途的;)

这只是python的一个惯例。所有指定都只会为现有对象创建新句柄。这是一个非常合理的规则,因为它保持了语义的简单和透明;在其他语言中,您可能经常想知道是修改现有对象,还是创建新对象的句柄。如果您不想在现有对象上使用新名称,python总是强制您将其显式化。至于为什么要这样做:尝试查找任何一段python代码,看看它包含多少赋值语句。显然,它是有用途的;)

如果你想真正理解这里发生的事情,请阅读Ned Batchelder。如果你想真正理解这里发生的事情,请阅读Ned Batchelder。