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

Kob*_*ohn 5 python 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()
Run Code Online (Sandbox Code Playgroud)

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

>>> 
number of items in a: 1
a-data
number of items in b: 1
a-data
Run Code Online (Sandbox Code Playgroud)

S.L*_*ott 8

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

做这个.

class Node:
    def __init__(self, data = None):
        self.data = data if data is not None else []
Run Code Online (Sandbox Code Playgroud)

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

  • @Matthew J Morrison:不是一回事,将错误的东西传递给数据并且它会中断. (2认同)

Dav*_*d Z 6

问题出在这一行:

def __init__(self, data = []):
Run Code Online (Sandbox Code Playgroud)

当您编写data = []一个空列表作为该参数的默认值时,Python 只创建一个列表一次,并且每次在没有显式data参数的情况下调用该方法时都使用相同的列表。在你的情况,这种情况发生在创造双方ab,因为你不给一个明确的名单要么构造,所以无论ab使用相同的对象作为自己的data名单。您对其中一个所做的任何更改都将反映在另一个中。

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

def __init__(self, data=None):
    if data is None:
        data = []
Run Code Online (Sandbox Code Playgroud)