对象的属性存储在同一内存地址中

2024-09-29 01:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为特定目的创建一个类(这次是partilce模拟)当我用该类声明两个不同的对象时,它们本身共享不同的内存地址,但它们的属性共享相同的地址,这导致修改其中任何一个来修改另一个,有什么帮助吗?我卡住了。你知道吗

代码逻辑错误块:

# 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

Tags: 对象self目的id声明isnparray
1条回答
网友
1楼 · 发布于 2024-09-29 01:24:42

好吧,正如我在评论中预期的,你有一个可变的默认参数。你知道吗

默认可变参数的行为是一件非常有趣的事情(例如:veeery fuzzing,但实际上是合乎逻辑的),但是您可以阅读它们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,确保每次创建构造函数时都创建一个新实例。你知道吗

将此方法用于每个可变的默认参数-列表、字典、集合。。。或者你自己的类来避免这个问题。你知道吗

相关问题 更多 >