我遇到了这个link中描述的问题。在使用dict理解时我输入了
keys = [x for x in range(21)]
value = [0,0]
dict1 = {key: value for key in keys}
而不是:
keys = [x for x in range(21)]
value = [0,0]
dict1 = {key: list(value) for key in keys}
在前一种情况下,问题仍然存在。所有键值都指向同一个列表。为什么会这样?本质上,我不明白的是list([0,0])如何不创建[[0,0]]列表?
编辑:我知道列表(arg)只有一个参数。但是在列表上运行列表意味着什么呢?答案 0 :(得分:1)
我们说你有:
a = [0, 0]
b = list([0, 0])
a
和b
都是包含相同值的列表。但它们都是list
的唯一实例。
现在,如果你这样做:
c = a
d = b
c
指向同一个a
和d
到b
的实例,因此如果您修改c
的值,它将会是也反映在a
中(与d
和b
相同)。
但是,如果你这样做:
c = list(a)
您基本上创建了a
的浅表副本。这意味着,您创建了一个新列表c
,其中包含与a
相同的值。因此c
的任何变异都不会影响a
,因为它现在是一个独特的list
实例。
但要小心,如果您的列表包含可变对象,它们仍然可以通过复制列表进行变异。使用copy.deepcopy
确保将所有对象复制为新对象。
答案 1 :(得分:1)
关于你的第二个问题,“实质上,我不明白的是列表([0,0])如何不创建[[0,0]]列表?”
list()
函数的工作方式是它将某种容器(特别是可迭代的容器)作为参数,并迭代它,将容器中的每个元素放入一个新列表中。
例如,string
是可迭代的,每个元素都是单个字符:
>>> list('spam')
['s', 'p', 'a', 'm']
整数的tuple
也是可迭代的:
>>> list((1, 2, 3, 4))
[1, 2, 3, 4]
当然,列表本身是可迭代的,因此在现有list()
上运行list
只会生成具有相同内容的新list
:
>>> list(['oranges','spam',22.3])
['oranges', 'spam', 22.3]
您不能做的是将整数传递给list()
,因为整数不可迭代:
>>> list(42)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
答案 2 :(得分:0)
您正在使用list([0, 0])
创建一个新列表,而不是一遍又一遍地使用相同的列表。
答案 3 :(得分:0)
list([0,0])
每次都会创建一个 new 列表对象。
value = [0, 0]
v2 = list(value)
assert value == v2
assert id(value) != id(v2)
答案 4 :(得分:0)
list(x)
表示从x的内容创建一个新列表,而不是创建一个包含x
作为唯一元素的新的单元素列表。您value
的内容是两个数字(均为0),因此list(value)
会生成一个包含两个零的新列表。
在您的第一个示例中,没有创建新列表;相同的列表value
被设置为每个键的值。