为什么不将可变变量分配在一起而不进行链接?

时间:2013-01-05 02:01:57

标签: python variable-assignment immutability mutable

请考虑以下事项:

>>> 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

我认为这可能与不变性有关,但这种行为对我来说很奇怪。谁能解释为什么会发生这种情况?

3 个答案:

答案 0 :(得分:5)

  

发生了什么事?其他不可变数据类型(如整数)不会发生这种情况。

你击中头部。不可变数据类型(整数,字符串等)在可变数据类型(列表,字典等)的情况下不会以这种方式运行。

执行a = b = c = 0时,所有三个名称都指向同一个内存。由于整数是不可变的,当你更改一个值时,它必须在新内存中创建一个新的整数对象,而其他对象则保持指向旧对象。可变对象在适当的位置进行了修改,因此所有名称仍指向相同(已修改)的对象。

答案 1 :(得分:1)

与做

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

键入

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

你正在制作三个单独的词组,

a = b = c = {}

是一个有三个'名字'的词典

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

a = b = c = 0
b += 1
print id(b)
print id(c)

答案 2 :(得分:1)

你可以试试这个:

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

编辑:

a,b,c = ({} for i in range(3))  # <-- RIGHT!