2

考虑以下:

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

好的,这一切都很好。正是我所期望的。所以我把它缩短了。

>>> 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所有三个名称都指向同一个内存。由于整数是不可变的,因此当您更改 1 的值时,它必须在新内存中创建一个新的整数对象,而其他整数对象仍指向旧对象。可变对象被原地修改,因此所有名称仍然指向同一个(修改后的)对象。

于 2013-01-05T02:09:07.930 回答
1

你可以试试这个:

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

编辑:

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

它和做的一样

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

当您键入

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

您正在创建三个单独的字典,

a = b = c = {}

是一个带有三个“名字”的字典

因为整数(和其他类型)是不可变的,所以它们需要内存中的新实例。例如,如果你这样做

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