web-dev-qa-db-ja.com

Python引数としてリストを渡す

このコードを実行する場合:

def function(y):
    y.append('yes')
    return y

example = list()
function(example)
print(example)

変数 'example'を直接変更していないのに、なぜ['yes']を返すのでしょうか。また、 'example'が関数の影響を受けないようにコードを変更するにはどうすればよいですか?

22
Slinc

すべてが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']
[]
43
Vinko Vrsalovic

コードを変更する最も簡単な方法は、関数呼び出しに[:]を追加することです。

def function(y):
    y.append('yes')
    return y



example = list()
function(example[:])
print(example)
9
Mike Kaufman

"なぜ['yes'] "

リストを変更したため、example

"変数 'example'を直接変更していない場合でも。"

ただし、変数exampleで指定されたオブジェクトを関数に提供しました。関数は、オブジェクトのappendメソッドを使用してオブジェクトを変更しました。

SOの他の場所で説明したように、appendは新しいものを作成しません。オブジェクトを所定の場所に変更します。

list.appendがfalseと評価される理由リストのPython append()対+演算子、なぜこれらの結果が異なるのか?Pythonリスト戻り値を追加

そして、「例」が関数によって影響されないようにコードを変更するにはどうすればよいですか?

それはどういう意味ですか?関数によってexampleを更新したくない場合は、関数に渡さないでください。

関数で新しいリストを作成する場合は、関数を作成して新しいリストを作成します。

8
S.Lott

これは、リストを印刷する前に関数を呼び出したためです。リストを印刷してから関数を呼び出してから再度リストを印刷すると、空のリストに続いて追加バージョンが表示されます。コードの順序です。

0
David Agabi