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」「」は
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」「」は
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
整数、浮動小数点、文字列を、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ペアを削除するか、新しいペアを追加する必要があります。
[OK]を...今わかった。キーを変更すると、ディクショナリがより多くの時間を取るようにする値を参照するハッシュマップを変更する必要があります。 – Arjunsingh
は、キーを(1,2)から(1,2,3)に更新しないでください。 これは良い習慣であるかどうかわかりません。 – Arjunsingh
@Arjunsinghたぶん、あなたは[Pythonの名前と値]について、これを読みたい(https://nedbatchelder.com/text/names.html) – MrT
その記事@Piintheskyより理にかなって... :) – Arjunsingh