【问题标题】:Objects' Attributes stored in same memory address [duplicate]对象的属性存储在相同的内存地址中[重复]
【发布时间】:2019-07-10 11:31:54
【问题描述】:

我正在为特定目的(这次是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

【问题讨论】:

  • 请出示构造函数。您创建的 S 可能在对象中是通用的(例如,您有一个可变的默认值)。
  • 完成,构造函数已添加。
  • 是的,initS 有一个可变的默认参数;正如 h4z3 所期望的那样。没有显式传递 initS 值而创建的所有实例共享同一个 NumPy 数组。

标签: python class object memory


【解决方案1】:

好的,正如我在 cmets 中所期望的那样,你有一个可变的默认参数。

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

将此方法用于每个可变的默认参数 - 列表、字典、集合...或您自己的类,以避免将来出现此问题。

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 2016-12-18
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2018-09-08
    • 2023-03-08
    相关资源
    最近更新 更多