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
解决方案
好的,正如我在评论中所期望的那样,您有一个可变的默认参数。
默认可变参数的行为非常有趣(如:令人困惑但实际上合乎逻辑),但您可以在此处阅读它们。
你需要知道的是:永远不要使用可变的东西作为默认参数。改用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
和 inline if/else
,确保每次创建构造函数时都创建一个新实例。
将此方法与每个可变的默认参数(列表、字典、集合...或您自己的类)一起使用,以避免将来出现此问题。
推荐阅读
- haskell - 围绕 IO 创建一个包装器 Monad
- debugging - 在 VS Code 中使用 Docker-compose 调试 Odoo
- r - 将数据框中的所有数字列四舍五入为不同的位数
- javascript - Node/JavaScript 中的条件语句 - 超出调用堆栈大小
- python - 如何使用 min、max 和 sum 从一到百万求和?(循环中)
- winapi - 如何在 WINAPI 中获取 Windows 10 构建版本、修订号?
- firebase - 如何根据集合中的文档位置进行分页?(偏移分页)
- javascript - 如何使用 People API 和 Nodejs 创建谷歌联系人
- django - Django:在 values() 查询集中检查 is_null
- go - Golang grpc.server:理解服务器和服务的概念