我正在努力理解为什么我的简单代码会如此表现。我创建了两个实例a和b,它们将一个数组作为参数。然后,我定义了一种方法来更改实例数组之一,但随后都被更改了。知道为什么会发生这种情况以及如何避免方法更改其他实例吗?

import numpy as np
class Test:
  def __init__(self, arg):
    self.arg=arg


  def change(self,i,j,new):
    self.arg[i][j]=new




array=np.array([[11,12,13]])
a=Test(array)
b=Test(array)
#prints the same as expected
print(a.arg)
print(b.arg)
print()
a.change(0,0,3)
#still prints the same, even though I did
#not change b.arg
print(a.arg)
print(b.arg)

最佳答案

因为您分配的对象与实例成员相同。您可以使用np.array(x, copy=True)x.copy()生成一个新的数组对象:

array = np.array([[11,12,13]])
a = Test(array.copy())
b = Test(np.array(array, copy=True))


另外,如果您的arg始终是np.array,则可以在__init__方法中进行操作(如注释中的roganjosh所示):

class Test:
    def __init__(self, arg):
        self.arg = np.array(arg, copy=True)
    ...

关于python - 方法更改两个实例,即使仅应用于其中一个实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47929642/

10-13 09:11