このコードを実行する場合:
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
変数 'example'を直接変更していないのに、なぜ['yes']を返すのでしょうか。また、 'example'が関数の影響を受けないようにコードを変更するにはどうすればよいですか?
すべてがPythonのリファレンスです。その振る舞いを回避したい場合は、list()
を使用して元の新しいコピーを作成する必要があります。リストにさらに参照が含まれる場合は、 deepcopy() を使用する必要があります
def modify(l):
l.append('HI')
return l
def preserve(l):
t = list(l)
t.append('HI')
return t
example = list()
modify(example)
print(example)
example = list()
preserve(example)
print(example)
出力
['HI']
[]
コードを変更する最も簡単な方法は、関数呼び出しに[:]を追加することです。
def function(y):
y.append('yes')
return y
example = list()
function(example[:])
print(example)
"なぜ['yes']
"
リストを変更したため、example
。
"変数 'example'を直接変更していない場合でも。"
ただし、変数example
で指定されたオブジェクトを関数に提供しました。関数は、オブジェクトのappend
メソッドを使用してオブジェクトを変更しました。
SOの他の場所で説明したように、append
は新しいものを作成しません。オブジェクトを所定の場所に変更します。
list.appendがfalseと評価される理由 、 リストのPython append()対+演算子、なぜこれらの結果が異なるのか? 、 Pythonリスト戻り値を追加 。
そして、「例」が関数によって影響されないようにコードを変更するにはどうすればよいですか?
それはどういう意味ですか?関数によってexample
を更新したくない場合は、関数に渡さないでください。
関数で新しいリストを作成する場合は、関数を作成して新しいリストを作成します。
これは、リストを印刷する前に関数を呼び出したためです。リストを印刷してから関数を呼び出してから再度リストを印刷すると、空のリストに続いて追加バージョンが表示されます。コードの順序です。