説明は、この質問への回答で行われます。ここで要約すると:
Pythonの関数は一種のオブジェクトです。それらは一種のオブジェクトであるため、インスタンス化されるとオブジェクトのように機能します。関数は、デフォルトの引数として可変属性で定義されている場合、可変リストである静的属性を持つクラスとまったく同じです。
Lennart Regebroには良い説明があり、 RobertoLiffredoによる質問への回答は優れています。
レナートの答えを適応させるために...私が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
ます。