引用同一对象问题的两个实例

时间:2019-07-25 10:10:46

标签: python class instance

我有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!

2 个答案:

答案 0 :(得分:2)

left的{​​{1}}和right成员是两个不同的对象,但是它们共享作为GenericData定义中默认参数创建的相同列表实例。

TestData

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

答案 1 :(得分:1)

更改此

class TestData:
    def __init__(self, t=[], x=[], y=[]):
        self.t = t
        self.x = x
        self.y = y

对此

class TestData:
    def __init__(self, t=None, x=None, y=None):
        if t is None:
            t = []
        if x is None:
            x = []
        if y is None:
            y = []
        self.t = t
        self.x = x
        self.y = y

通常,当我们使用列表或字典作为函数的默认参数时,我们希望程序在每次调用该函数时创建一个新的列表或字典。但是,这不是Python要做的。第一次调用该函数时,Python将为列表或字典创建一个持久对象,因为Python中的函数是一类对象。以后每次调用该函数时,Python都会使用与第一次调用该函数相同的持久对象。

参考:https://effbot.org/zone/default-values.htm