当我用该类声明两个不同的对象时,我正在为特定目的创建特定的类(这次是模拟),它们本身共享不同的内存地址,但是它们的属性共享相同的地址,这导致修改其中任何一个修改其他,有帮助吗?我被困住了。
代码逻辑错误块:
# Particle is the class
particle1 = Particle(m = 2)
particle2 = Particle(m = 4)
# object.S is an atrribute
particle1.S[1]=np.array([0,1,32])
particle2.S[1]=np.array([2,0,3])
hex(id(particle1.S))==hex(id(particle2.S)) # returns True
这是构造函数:
def __init__(self, m = 0, Q = 0, initS = np.array([[0,0,0],[0,0,0],[0,0,0]]) ):
self.initS = initS
self.S = self.initS
self.m = m; self.t = 0
self.charge = Q
答案 0 :(得分:0)
好的,正如我在评论中所期望的那样,您有一个可变的默认参数。
默认可变参数的行为是一件非常有趣的事情(例如:veeeery令人困惑,但实际上是合乎逻辑的),但是您可以阅读它们here。
您需要知道的是:永远不要将可变的东西用作默认参数。改用None
并在正文中检查它:
def __init__(self, m = 0, Q = 0, initS = None ):
self.initS = initS if initS else np.array([[0,0,0],[0,0,0],[0,0,0]]) #here
self.S = self.initS
self.m = m; self.t = 0
self.charge = Q
作为默认参数,np.array([[0,0,0],[0,0,0],[0,0,0]])
仅创建一次并可以重复使用。使用None
和内联if/else
,确保每次创建构造函数时都创建一个新实例。
将此方法与每个可变的默认参数一起使用-列表,字典,集合...或您自己的类,以避免将来出现此问题。