这个问题的答案在这里。简而言之:
Python中的函数是一种对象。因为它们是一种对象,所以在实例化时它们的行为就像对象一样。如果使用可变属性作为默认参数定义函数,则该函数与具有静态属性的可变列表的类完全相同。
Lennart Regebro提供了很好的解释,Roberto Liffredo的答案也非常出色。
为了适应Lennart的回答...如果我有一个BananaBunch
类:
class BananaBunch:
bananas = []
def addBanana(self, banana):
self.bananas.append(banana)
bunch = BananaBunch()
>>> bunch
<__main__.BananaBunch instance at 0x011A7FA8>
>>> bunch.addBanana(1)
>>> bunch.bananas
[1]
>>> for i in range(6):
bunch.addBanana("Banana #" + i)
>>> for i in range(6):
bunch.addBanana("Banana #" + str(i))
>>> bunch.bananas
[1, 'Banana #0', 'Banana #1', 'Banana #2', 'Banana #3', 'Banana #4', 'Banana #5']
// And for review ...
//If I then add something to the BananaBunch class ...
>>> BananaBunch.bananas.append("A mutated banana")
//My own bunch is suddenly corrupted. :-)
>>> bunch.bananas
[1, 'Banana #0', 'Banana #1', 'Banana #2', 'Banana #3', 'Banana #4', 'Banana #5', 'A mutated banana']
这如何应用于函数呢?Python中的函数是对象。这值得重复。Python中的函数是对象。
因此,当您创建一个函数时,您正在创建一个对象。当您给函数赋予可变默认值时,您正在使用可变值填充该对象的属性,并且每次调用该函数时,您都在操作相同的属性。因此,如果您使用可变调用(例如append),则您正在修改同一对象,就像向bunch
对象添加香蕉一样。