2017-12-16 25 views
1
a = (1,2) 
b = {a:1} 
print(b[a]) # This gives 1 
a = (1,2,3) 
print(b[a]) # This gives error but b[(1,2)] is working fine 

タプル(1,2,3)が作成されたときに、aが(1,2,3)に変更された後、pythonはガベージコレクタを実行しません。新しいオブジェクトとタプル(1,2)はまだbで参照されています。なぜ辞書キーが変更されないのですか?

「B」「」は

答えて

2

b = {a:1}が値としてキーと1としてaの値を持つ辞書を作成し、変更された後、キーを変更しない理由を私は理解していなかったことです。 の値を割り当てると、新しい値が作成され、bは古い値をキーとして再学習します。 idを用い

次の例では、それを示すことができる:

>>> a = (1,2) 
>>> b = {a:1} 
>>> id(a) 
139681226321288 
>>> a = (1,2,3) 
>>> id(a) 
139681416297520 
>>> id(b.keys()[0]) 
139681226321288 
+0

は、キーを(1,2)から(1,2,3)に更新しないでください。 これは良い習慣であるかどうかわかりません。 – Arjunsingh

+3

@Arjunsinghたぶん、あなたは[Pythonの名前と値]について、これを読みたい(https://nedbatchelder.com/text/names.html) – MrT

+0

その記事@Piintheskyより理にかなって... :) – Arjunsingh

1

整数、浮動小数点、文字列を、Pythonでのタプルは不変です。辞書はhashable(不変の組み込みオブジェクトはハッシュ可能です)のキーだけを許可します。 @Mureinikが原因の原因を正しく指定しているので、上記の手順でデータを変更できる別の例を挙げます。

>>> l = [1,2,3] 
>>> b = {'3' : l} 
>>> b 
{'3': [1, 2, 3]} 
>>> l.append(5) 
>>> l 
[1, 2, 3, 5] 
>>> b 
{'3': [1, 2, 3, 5]} 

しかし、彼らはハッシュ化されているとして、あなたは辞書のキーを変更することはできません(値のみを更新することができます)。既存のKey-Valueペアを削除するか、新しいペアを追加する必要があります。

+0

[OK]を...今わかった。キーを変更すると、ディクショナリがより多くの時間を取るようにする値を参照するハッシュマップを変更する必要があります。 – Arjunsingh

関連する問題