1
4

1 に答える 1

2

簡単な答えは、defステートメントがオブジェクトを作成し、オブジェクトの実行時(def行が実行されるとき)に、新しいリストオブジェクトが作成され、オブジェクトにアタッチされることです(この場合、オブジェクトは関数です)。

その後の実行時に、期待できるのは、新しいリストが生成されることです。しかし実際には、関数定義が最初に実行されたときに作成されたものと同じオブジェクトが残ります。そして、そのオブジェクトのすべての「メンバー」は同じままです。それが同じリストに追加し続ける理由です。

それが悪いと見なされる理由は、引数から期待できること(実行のたびに新しいリストが生成されること)がステートメントの機能ではないためです。これが、より良いパターンがパスNoneまたは他の空白のオブジェクトである理由です。

次のことを考慮してください。

>>> bad_append('foo')
['foo']
>>> bad_append('bar')
['foo', 'bar']
>>> bad_append('zoo')
['foo', 'bar', 'zoo']
>>> bad_append('bar',[])
['bar']
>>> bad_append('bar') # what?
['foo', 'bar', 'zoo', 'bar']

私が新しいリストを渡したときにわかるように、次の実行ではそれは固執しません。むしろ、defが実行されたときに作成された元のリストが残ります。

詳細については、effbotによるこの優れた説明を参照してください。

于 2012-08-30T13:41:31.187 に答える