はあなたが理解しようとしているものの小型版である以下の場合を考えてみます。
def foo(x):
x = []
x.append(1)
print(x)
my_list = []
foo(my_list)
print(my_list)
あなたはでそれを修正し、それはその後、引数として受け取ってリストをクリアする機能foo
を期待します番号1
が追加されました。実際には、それは何が起こるかではありません...
>>> foo(my_list)
[1]
>>> print(my_list)
[]
なぜそうですか?
あなたがx = []
を書いたとき、代わりに元のリストをクリアすると、あなたが実際には、新しいリストを参照するために、ローカル変数x
を変更したため。一方、my_list
はまだ元のリストを参照しています!
それでは、同じではなくx[:]
を使用してみましょう:今すぐ
def foo(x):
x[:] = []
x.append(1)
print(x)
my_list = []
foo(my_list)
print(my_list)
、すべてはあなたが期待通りに動作するはずです:
>>> foo(my_list)
[1]
>>> print(my_list)
[1]
x[:]
トリックは基本的に置き換えるにインタプリタを語っていますx
によって参照されるリストの内容は、新しい空のリストによって示されます。今、指しているリストに変更されるのはx
ではありません。実際には、それはまだmy_list
と同じリストを参照し、副作用として、これは元のリストを変更します。
実際に何が起こっているのかを実際に把握するには、how variables are passed by assignment in Pythonを参照してください。特にポインターの概念に精通していない場合は、