为什么dict中的值在python中更改为total?

为什么dict中的值在python中更改为total?,python,dictionary,Python,Dictionary,最近我做了两个实验: (1) : (2) : 为什么(2)中出现此问题?为什么(1)没有这个问题呢?简短回答:因为dict对象是可变的,而int对象是不可变的 详细信息: 看看[{'a':True,'b':True}]*3 与 创建包含对同一对象3次引用的列表 >>> id(l[0]) 139685186829320 >>> id(l[1]) 139685186829320 >>> id(l[2]) 139685186829320 因此,当

最近我做了两个实验:

(1) :

(2) :


为什么(2)中出现此问题?为什么(1)没有这个问题呢?

简短回答:因为
dict
对象是可变的,而
int
对象是不可变的

详细信息:

看看
[{'a':True,'b':True}]*3

创建包含对同一对象3次引用的列表

>>> id(l[0])
139685186829320
>>> id(l[1])
139685186829320
>>> id(l[2])
139685186829320
因此,当您更改其中一个对象时,您将更改所有对象(对于可变对象)

如果需要不同词典的列表,可以使用:

>>> l = [{} for x in range(3)]
>>> id(l[0])
139685161766216
>>> id(l[1])
139685161766536
>>> id(l[2])
139685161766600
在您的情况下,它应该如下所示:

a = dict(zip([1, 2, 3], [{'a': True, 'b': True} for i in range(3)]))
对于不可变对象,它是不同的

不能更改不可变对象。无论您在哪里更改不可变对象,都会创建一个新对象

因此,当您尝试更改列表中的不可变对象时,将创建一个新对象:

>>> l = [1] * 3

>>> id(l[0])
139685185487008
>>> id(l[1])
139685185487008
>>> id(l[2])
139685185487008

>>> l[0] = 2

>>> id(l[0])
139685185487040  # new object created instead of old object being modified
>>> id(l[1])
139685185487008
>>> id(l[2])
139685185487008

如果使用列表理解(代替zip)或for()循环,则不会使用同一对象3次

a = {ctr:{'a':True,'b':True} for ctr in range(1, 4)}
print a
a[1]['a']=False
print a
a = dict(zip([1, 2, 3], [{'a': True, 'b': True} for i in range(3)]))
>>> l = [1] * 3

>>> id(l[0])
139685185487008
>>> id(l[1])
139685185487008
>>> id(l[2])
139685185487008

>>> l[0] = 2

>>> id(l[0])
139685185487040  # new object created instead of old object being modified
>>> id(l[1])
139685185487008
>>> id(l[2])
139685185487008
a = {ctr:{'a':True,'b':True} for ctr in range(1, 4)}
print a
a[1]['a']=False
print a