2016-05-30 60 views
2

私が聞いたことは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] 

は、私はそれが出力する感じ、この私がdic2lis2をリセットしておりますので。なぜこれはデフォルトの動作ですか?関数に入ると、Pythonはdic2のコピーを作るべきではありませんか? dic2=dic1dic1のコピーを作成して、メモリ内の同じ場所に別のポインタを作成するのではなく、

(つまり、何が起こっているのか、実際の場合)私はdic2 = dic1.copy()dic2 = dic1を交換(または関数にdic=dic.copy()を追加すること)によって、dic1でこの現象を防ぐことができますが、私はリストでそれをどのように行うのですか?彼らはコピー方法を持っていません。さらに、関数内で辞書(またはPandasのデータフレームなど)を扱うたびに、コピーメソッドを使用することを忘れずに、デフォルトでこれを防ぐ方法がありますか? Pythonの上

乾杯

+0

Pythonのすべての値は、参照渡しです。より完全な説明については、このhttp://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-referenceを参照してください。 – jstlaurent

答えて

1

を、リストには、このように、彼らはここに同じオブジェクト

あり、これはlis2はLIS1のためのちょうど別の名前であることを意味し、変更可能ですlis2にLIS1のコピーを作成するには2つの方法があります:

lis2 = lis1[:] 

lis2 = list(lis1) 

list()の方が読みやすくなっています。

関連する問題