繁体   English   中英

我究竟做错了什么? Python对象实例化保留以前实例化的数据?

[英]What am I doing wrong? Python object instantiation keeping data from previous instantiation?

有人能指出我做错了什么或我的理解错了吗?

对我来说,下面的实例化两个对象的代码似乎应该为每个实例化提供单独的数据。

class Node:
    def __init__(self, data = []):
        self.data = data

def main():
    a = Node()
    a.data.append('a-data') #only append data to the a instance

    b = Node() #shouldn't this be empty?

    #a data is as expected
    print('number of items in a:', len(a.data))
    for item in a.data:
        print(item)

    #b data includes the data from a
    print('number of items in b:', len(b.data))
    for item in b.data:
        print(item)

if __name__ == '__main__':
    main()

但是,第二个对象是使用第一个数据创建的:

>>> 
number of items in a: 1
a-data
number of items in b: 1
a-data

您不能将可变对象用作默认值。 所有对象将共享相同的可变对象。

做这个。

class Node:
    def __init__(self, data = None):
        self.data = data if data is not None else []

创建类定义时,它会创建[]列表对象。 每次创建类的实例时,它都使用相同的列表对象作为默认值。

问题出在这一行:

def __init__(self, data = []):

当您编写data = []以将空列表设置为该参数的默认值时,Python仅创建一次列表,并且每次调用该方法时都使用相同的列表而没有显式data参数。 在您的情况下,这发生在ab的创建中,因为您没有为构造函数提供显式列表,因此ab都使用与其data列表相同的对象。 您对其中的任何更改都将反映在另一个中。

为了解决这个问题,我建议用构造函数的第一行替换

def __init__(self, data=None):
    if data is None:
        data = []

为函数或方法提供默认值时,通常需要提供不可变对象。 如果您提供空列表或空字典,您最终将调用该函数或共享该对象的方法。

一个好的解决方法是:

def __init__(self, data = None):
    if data == None:
        self.data = []
    else:
        self.data = data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM