这个问题在这里已有答案:
有一个类,构造函数采用“列表类型”的参数。此参数的默认值为空列表。构造函数使用此参数初始化其中一个类数据成员。然后,当我创建这个类的两个不同的实例对象时,它们都指向相同的列表。这是为什么?
我试图将默认值设置为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的默认参数在定义函数时被计算一次,而不是每次调用函数时(比如Ruby)。这意味着如果你使用一个可变的默认参数并对其进行变异,那么你将为该函数的所有未来调用改变该对象。