4

ループ中に辞書を変更すると実行時エラーが発生する可能性があることは認識していますが、それを行う適切な方法があることは知っており、どれが受け入れ可能でどれがそうでないかを理解できません。実行時エラーが発生する可能性があるため、それらをコンソールでテストしても役に立ちません。私はそれが正しいのか、それとも単に幸運なのかわかりません。

ステータスの辞書であるステータス属性があるとします。

self.status = {"overall": False, "started":False,
               "ready":False, "awakeQueried":False,
               "allQueried":False}

これらは、実行中にさまざまな True または False に変化します。失敗を処理する関数があり、それらすべてを False に設定したいと考えています。エレガントな方法は何ですか?これまでのところ、これは機能していますが、ある時点で実行時エラーが発生するかどうかはわかりません。

self.status = {key:False for key in self.status}

それをしてもいいですか?ここでは、低レベルの機能についてはわかりません。私は .items() などでコピーを作成していません。辞書を上書きしていますが、最初に右側を処理する必要がありますが、これは理解であるため、self.status を上書きする前に最初に理解全体を完了するかどうかはわかりません。新しいdictを理解してから設定している間、一種のコピーをメモリに保存しますか、それとも反復ごとにdictを理解してアイテムを設定することをループしますか(問題が発生すると思います)?

4

2 に答える 2

3

それはまさにあなたが説明した理由で機能します。右側の内包表記は新しい辞書を作成し、それself.statusが設定される前に完了します。

于 2015-04-19T08:03:04.583 に答える
1

はい、うまくいきます。Python では変数は参照であるため、右側に新しい辞書を作成し、それを 1 つのステップで割り当てて、単一の辞書へself.statusの読み取りと書き込みの実行時エラーの余地を残しません。

于 2015-04-19T08:09:23.260 に答える