1

同僚の Python 2.7 スクリプトを手伝っているときに、奇妙なことに気付きました。彼は辞書の値としてリストを含む辞書を持っています。彼は、辞書の値を新しい変数に割り当ててから、リストを編集していました。私が得た奇妙な部分は、新しい変数のリストの変更も辞書に反映されていたことです。シェルで簡単な例を繰り返し、以下に投稿しました。私も同じことを試しましたが、辞書の値として文字列を使用しましたが、効果はありませんでした。ここに欠けているものはありますか、それともある種のバグですか? ありがとう。

>>> dict1 = {}
>>> dict1['foo'] = [1,2,3]
>>> print dict1     
 {'foo': [1, 2, 3]}    
>>> bar = dict1['foo']
>>> bar.append(4)
>>> print dict1    
 {'foo': [1, 2, 3, 4]}

上記の例では、4 がbarに追加され、'foo' の値が [1,2,3] のままであると予想していました。

4

1 に答える 1

3

リストのコピーを取得するのではなく、リスト自体への参照を取得します。リストは変更可能であるため、動作は完全に予期されたものです。

これを、リストを指す 2 番目の変数の使用と比較してください。

>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> a
[1, 2, 3, 4]

代わりに独立したリストが必要な場合は、コピーを作成します。

>>> c = list(a)
>>> c.append(5)
>>> c
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4]

コピーを作成するもう 1 つの方法は、フルリスト スライスを使用することです。

>>> c = a[:]
于 2013-01-09T16:23:18.243 に答える