为什么 python 在更改一个实例时会更改 class 的所有实例?
Why does python change all instances of a class upon changing one single instance?
在下面的 python 脚本中,我使用相同的数组 s 初始化 class 的两个实例(tt1 和 tt2)的属性 v。然后,我仅将“添加”方法应用于其中一个实例,更改属性 v。但是,不仅 tt1 的 v 发生了变化,tt2 的 v 也发生了变化。此外,s也发生了变化。如果 s 被定义为标量值而不是数组(并且方法 add() 相应更改),属性 v 仅针对 tt1 更改。为什么是这样?非常感谢您的反馈。
这是脚本:
import numpy as np
s = np.array([1,2,3])
class test_class:
def __init__(self,vv):
self.v = vv
def add(self,h,i):
aux = self.v
aux[i] += h
self.v = aux
tt1=test_class(s)
tt2=test_class(s)
tt1.add(1,0)
print('s = ', s)
print('tt1.v = ',tt1.v)
print('tt2.v = ',tt2.v)
这是输出:
s = [2 2 3]
tt1.v = [2 2 3]
tt2.v = [2 2 3]
您只是在使用引用,但数据结构的地址与您最初初始化的列表相同尝试使用 deepcopy 创建另一个列表,您可以独立工作。
在下面的 python 脚本中,我使用相同的数组 s 初始化 class 的两个实例(tt1 和 tt2)的属性 v。然后,我仅将“添加”方法应用于其中一个实例,更改属性 v。但是,不仅 tt1 的 v 发生了变化,tt2 的 v 也发生了变化。此外,s也发生了变化。如果 s 被定义为标量值而不是数组(并且方法 add() 相应更改),属性 v 仅针对 tt1 更改。为什么是这样?非常感谢您的反馈。
这是脚本:
import numpy as np
s = np.array([1,2,3])
class test_class:
def __init__(self,vv):
self.v = vv
def add(self,h,i):
aux = self.v
aux[i] += h
self.v = aux
tt1=test_class(s)
tt2=test_class(s)
tt1.add(1,0)
print('s = ', s)
print('tt1.v = ',tt1.v)
print('tt2.v = ',tt2.v)
这是输出:
s = [2 2 3]
tt1.v = [2 2 3]
tt2.v = [2 2 3]
您只是在使用引用,但数据结构的地址与您最初初始化的列表相同尝试使用 deepcopy 创建另一个列表,您可以独立工作。