2016-03-28 2 views
1

タイトルの名前を混乱させて申し訳ありません。 私は以下のコードがあります。しかし、私はそれを実行しようとすると、それはエラーで返され、変化にもかかわらずpython辞書が他の等価辞書で実行されたアクションに反応するのはなぜですか?

RuntimeError: dictionary changed size during iteration 

は「newdict」とない「辞書に

eps = [] 
newdict = dictionary.items 
for ep in range(minepisode, maxepisode + 1): 
    eps.append(str(ep)) 
for key in dictionary.keys(): 
    if key not in eps: 
     newdict.pop(key) 

を作られましたそれは私が反復していたものでした。 xの

x = {'1':'something'} 
newx = x 
newx.pop('1') 

「1」キー両方newx除去した。

シェルにいじり後、私は私はこのような2つの同一の辞書を行った場合ことを見出しました。どうしてこれなの?そして、元のコードのエラーをどのように修正する必要がありますか?

+4

を持っています。 dictを複製するには、コピーまたはディープコピーを使用します。 – Selcuk

+0

@Selcukありがとう!ちょうどこれを試して、今それは動作します – user3908469

答えて

2

まずPythonでdictmutableデータ構造...

だから、それはこのように動作します..ですだから、ここdictオブジェクトxが作成されている

x = {'1':'something'} 

...

newx = x 

ここでは、同じdictオブジェクトを別のvariableというオブジェクトに参照しました。

理想的には、あなただけの他の変数に同じオブジェクトを参照し、新しいオブジェクトを作成していない...

あなたはこのようにその類似性を見ることができます。..

>>> id(x) 
140222539383424 
>>> id(newx) 
140222539383424 

同上の両方のオブジェクトのあなたはまた、is

>>> newx is x 
True 
を使用して object similarityチェックを使用して、これを確認することができ

...同じです

したがって、xまたはnewxを変更しようとしているかどうかは関係ありませんが、同じ参照オブジェクトを変更していることは明らかです。

0

ループ中にdictを変更する場合は、copy.deepcopy()を使用する必要があります。両方のために別々のメモリを割り当てます。

例:

import copy 

a = {'key':'value'} 
b = copy.deepcody(a) 

うまくいけば、それはあなたを助けるでしょう。 :)

+0

コーディは非常に深いです – frei

0

あなたは犬がいます。あなたは異常な人で、犬はflash、奇数はturtleです。今日、3月28日、flashがフロント右足を痛めている場合、明日あなたがturtleにも負傷したフロント右足を持っていることが分かりますか?

Pythonはそのようなものです。永続的な名前のオブジェクトがあります。これらのオブジェクトの一部はであり、変更可能なものはです(文字列など)。 flashでラベル付けされた古いオブジェクトとturtleで新規作成されたオブジェクトは、可変オブジェクト(例えば、辞書)であり、オブジェクト自体に変更を直接適用することができます。それでもすべての名前で参照されます。

私には、不変オブジェクトの動作は最も驚くべきことですが、私は少数派であると理解しています。そのように私は保存が必要です。

免責事項:この投稿の作成に実際に傷ついた動物はありません。

0

リストcolours=['blue','green]があるとします。 palette=coloursのようなものを実行すると、という別名をcoloursという別名にします。どちらも同じメモリアドレスにある同じリストを参照します。

colours=['blue','green'] 
palette=colours 
print id(colours)==id(palette) #True 
print id(colours[0])==id(palette[0]) #True 

変更方法があります。 palette=list(colours)を定義するとします。これで、メモリ内の別のアドレスにある新しいリストが作成されました。しかし、両方のリストには同じアドレスに要素が含まれています:パレット[0]と色[0]は同じアドレスにあります。

colours=['blue','green'] 
palette=list(colours) 
print id(colours)==id(palette) #False 
print id(colours[0])==id(palette[0]) #True 

は最後に、あなたはあなただけの古い辞書への参照をコピーし、新しい辞書を作成していないdeepcopy

from copy inport deepcopy 
colours=['blue','green'] 
palette=deepcopy(colours) 
print id(colours)==id(palette) #False 
print id(colours[0])==id(palette[0]) #False 
関連する問題