2

次のことを考慮してください。

>>> a = {}
>>> b = {}
>>> c = {}
>>> c['a'] = 'b'
>>> a
{}
>>> b
{}
>>> c
{'a': 'b'}

OK、これはすべてうまくいっています。まさに私が期待していることです。それで私はそれを短くします。

>>> a = b = c = {}
>>> c['a'] = 'b'
>>> a
{'a': 'b'}
>>> b
{'a': 'b'}
>>> c
{'a': 'b'}

どうしたの?これは、整数などの他の不変のデータ型では発生しません。

>>> a = b = c = 0
>>> a += 1
>>> a
1
>>> b
0
>>> c
0

それは不変性に関係しているのではないかと思いますが、この振る舞いは私には非常に奇妙です。なぜそれが起こるのか、誰かが光を当てることができますか?

4

3 に答える 3

5

どうしたの?これは、整数などの他の不変のデータ型では発生しません。

あなたはそれを頭にぶつけます。不変のデータ型(整数、文字列など)はこのように動作しませんが、可変のデータ型(リスト、辞書など)は動作します。

あなたがするときa = b = c = 0、3つの名前はすべて同じメモリを指します。整数は不変であるため、1つの値を変更すると、新しいメモリに新しい整数オブジェクトを作成し、他のオブジェクトは古いオブジェクトをポイントしたままにする必要があります。可変オブジェクトはその場で変更されるため、すべての名前は同じ(変更された)オブジェクトを指します。

于 2013-01-05T02:09:07.930 に答える
1

それはするのと同じです

a = []
b = a
b.append(1)
print a

入力すると

a = {}
b = {}
c = {}

あなたは3つの別々の口述を作成しています、

a = b = c = {}

3つの「名前」を持つ1つの辞書です

int(およびその他のタイプ)は不変であるため、メモリ内に新しいインスタンスが必要です。例:

a = b = c = 0
b += 1
print id(b)
print id(c)
于 2013-01-05T02:03:56.910 に答える
1

あなたはこれを試すことができます:

a,b,c = [{}]*3   # <-- WRONG!

編集:

a,b,c = ({} for i in range(3))  # <-- RIGHT!
于 2013-01-05T02:52:19.427 に答える