首页 > 解决方案 > 两个实例引用同一个对象问题

问题描述

我有TestData我想存储time, x, y信息的课程。

然后我有一个GenericData类,我希望将两个TestData实例保存为leftright

我实例化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!

标签: pythonclassinstance

解决方案


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

因此,您应该避免使用可变的默认参数。


推荐阅读