解释在这个问题的答案中给出。在这里总结一下:
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 中的函数是 object。
所以当你创建一个函数时,你就是在创建一个对象。当你给一个函数一个可变的默认值时,你正在用一个可变的值填充该对象的属性,并且每次调用该函数时,你都在对同一个属性进行操作。因此,如果您正在使用可变调用(如 append),那么您正在修改同一个对象,就像您向bunch
对象添加香蕉一样。