私が聞いたことはPythonではよくあることですが、これがデフォルトであり、これを防ぐ方法を知りたいと思います。次のコードを考えてみましょう:私たちは、私はこのコードを実行Pythonは内部の関数から内部の辞書に変更する
dic1 = {'a':1, 'b':2}
lis1 = [1, 2]
def somefunc(dic):
dic.update({'b':20})
return dic
def otherfunc(lis):
lis.append(20)
return lis
for i in range(3):
dic2 = dic1
lis2 = lis1
print(dic2)
somefunc(dic2)
print(lis2)
otherfunc(lis2)
を、それが
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 20}
[1, 2, 20]
{'a': 1, 'b': 20}
[1, 2, 20, 20]
を出力しますが、なぜそれが次のように出力しないのですか?
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]
{'a': 1, 'b': 2}
[1, 2]
は、私はそれが出力する感じ、この私がdic2
とlis2
をリセットしておりますので。なぜこれはデフォルトの動作ですか?関数に入ると、Pythonはdic2
のコピーを作るべきではありませんか? dic2=dic1
dic1
のコピーを作成して、メモリ内の同じ場所に別のポインタを作成するのではなく、
(つまり、何が起こっているのか、実際の場合)私はdic2 = dic1.copy()
でdic2 = dic1
を交換(または関数にdic=dic.copy()
を追加すること)によって、dic1
でこの現象を防ぐことができますが、私はリストでそれをどのように行うのですか?彼らはコピー方法を持っていません。さらに、関数内で辞書(またはPandasのデータフレームなど)を扱うたびに、コピーメソッドを使用することを忘れずに、デフォルトでこれを防ぐ方法がありますか? Pythonの上
乾杯
Pythonのすべての値は、参照渡しです。より完全な説明については、このhttp://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-referenceを参照してください。 – jstlaurent