Python:如何在初始化默认函数参数时创建唯一的列表类型对象? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

有一个类,构造函数采用“列表类型”的参数。此参数的默认值为空列表。构造函数使用此参数初始化其中一个类数据成员。然后,当我创建这个类的两个不同的实例对象时,它们都指向相同的列表。这是为什么?

我试图将默认值设置为None,然后在类构造函数体中有条件地创建新的空列表。这很有效。不同的对象实例在其类数据成员中具有不同的列表。但是我想知道为什么它不能像我期望的那样工作,当我在函数参数默认值init中创建一个列表时,就像在下面的代码中一样:

class myClass:
    def __init__(self, user_list=list()):
        self.__class_list = user_list

    def addSomethingToList(self, a, b):
        self.__class_list.append([a,b])

    def whoAmI(self):
        return hex(id(self.__class_list))

    def getList(self):
        return self.__class_list

A = myClass()
B = myClass()

A.addSomethingToList(1,2)
B.addSomethingToList(33,44)

print("A",A.whoAmI(), A.getList())
print("B",B.whoAmI(), B.getList())

##################
#Expected results:
A 0x7f6dd49a6108 [[1, 2]]
B 0x7f6dd49a6148 [[33, 44]]

#Actual results:
A 0x7f736f1f40c8 [[1, 2], [33, 44]]
B 0x7f736f1f40c8 [[1, 2], [33, 44]]
python
1个回答
0
投票

引用Hitch Hicker's python guide

Python的默认参数在定义函数时被计算一次,而不是每次调用函数时(比如Ruby)。这意味着如果你使用一个可变的默认参数并对其进行变异,那么你将为该函数的所有未来调用改变该对象。

© www.soinside.com 2019 - 2024. All rights reserved.