指同一对象问题的两个实例

2024-05-03 16:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有TestData类,我想在其中存储time, x, y信息

然后我有一个GenericData类,其中我想要两个TestData实例保存为leftright

我实例化GenericData并向左边的实例附加一个值,但右边的实例也会更新

这意味着当我调用generic = GenericData(TestData(), TestData())时,两个TestData()调用是实例化同一个对象

如何在GenericData内实例化两个不同的TestData,以便独立地更新它们

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!

Tags: 对象实例selfright信息timeinitdef
2条回答

GenericDataleftright成员是两个不同的对象,但它们共享作为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

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

改变这个

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

相关问题 更多 >