2017-04-21 1 views
1

だから私は、例えば、C IEのポインタのように動作Pythonでの変数のように見えるものによってアップつまずい取得しています:リユース変数名

foo = ['item1', 'item2', 'item3'] 

今私はそのリストを割り当てる場合

my_dict['bar'] = foo 

すべての罰金ですが、今私がしなければ:キー辞書の値は「バー」です

foo.clear() 

その後、my_dic t ['bar']は空になり、fooとmy_dict ['bar']は同じデータを指す2つの異なる名前にすぎません。どうすればこの問題を回避できますか?fooをmy_dict ['bar']にダンプし、fooを辞書の次の項目に再利用してください。

これを回避して 'foo'を再利用するにはどうすればよいですか?

答えて

4

あなたはポインタのように正しいです。リスト、辞書、オブジェクトなどのデータのコレクションは、参照によって渡されます。したがって、mydict["bar"] = fooを設定するときは、それをfooの参照と等しく設定していました。

これを回避するには、fooのコピーを作成する必要があります。あなたは、新たな基準値と、浅いコピー

mydict["bar"] = foo[:]

Iスライスオペレータがfoo内のすべての要素の新しいリストを作成します。この場合にすることによって取得する必要があります。 copy pythonモジュールも同様の効果がありますが、ディープコピー操作をサポートしていると考えてください。すなわち、オブジェクト自体のコピー、およびその中に含まれるすべてのオブジェクトを作成する。

jasonharperさんのコメントも読んでください。要素のコピーが必要ない場合は、新しい空のリストを作成するほうが効率的です

+1

また、完全に新しいリストを開始するには 'foo.clear()'ではなく 'foo = []'を使用してください。 – jasonharper

+0

ありがとう、私はこれを行う簡単な方法があります。この機会に、私は本当に浅いコピーだったので、それは完璧です。 – iFunction