python - 两个实例引用同一个对象问题
问题描述
我有TestData
我想存储time, x, y
信息的课程。
然后我有一个GenericData
类,我希望将两个TestData
实例保存为left
和right
。
我实例化GenericData
并向左实例附加一个值,但右实例也被更新!
这意味着当我调用generic = GenericData(TestData(), TestData())
这两个TestData()
调用时正在实例化同一个对象。
如何TestData
在内部实例化两个不同的GenericData
,以便我可以独立更新它们?
class GenericData:
def __init__(self, left, right):
self.left = left
self.right = right
class TestData:
def __init__(self, t=[], x=[], y=[]):
self.t = t
self.x = x
self.y = y
generic = GenericData(TestData(), TestData())
generic.left.t.append(3)
print(generic.left.t)
print(generic.right.t)
[3]
[3] <-- This one should be empty!
解决方案
left
和的right
成员GenericData
是两个不同的对象,但它们共享相同的列表实例,这些实例是在TestData
定义中作为默认参数创建的。
In [4]: id(generic.right) == id(generic.left)
Out[4]: False
In [5]: id(generic.right.t) == id(generic.left.t)
Out[5]: True
因此,您应该避免使用可变的默认参数。
推荐阅读
- c++ - 为什么 C++ 不提供先进先出单链表?
- android - 如何在 Firestore 文档 Android 中添加新的子集合
- android - Google Authenticator - 无需移动应用的用户注册
- firebase - 如何通过云功能将 Nuxt SSR 应用部署到 Firebase?
- javascript - Angular 8 - 拦截由 Javascript 库发出的 AJAX 请求
- angular - 以可观察角度 9 更新数据
- identityserver4 - 使用外部声明填充访问令牌的最佳实践
- ios - 你好。我写了一个程序,在模拟器上重新运行后,它现在将主屏幕显示为黑色
- bash - 如何使用 shell 脚本判断 postgres 数据库表是否存在
- spring - 如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?