我有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!
答案 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都会使用与第一次调用该函数相同的持久对象。