python- list([0,0])与[0,0]的区别如何?

时间:2015-05-28 19:17:49

标签: python list dictionary

我遇到了这个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)只有一个参数。但是在列表上运行列表意味着什么呢?

5 个答案:

答案 0 :(得分:1)

我们说你有:

a = [0, 0]
b = list([0, 0])

ab都是包含相同值的列表。但它们都是list的唯一实例。

现在,如果你这样做:

c = a
d = b

c指向同一个adb的实例,因此如果您修改c的值,它将会是也反映在a中(与db相同)。

但是,如果你这样做:

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被设置为每个键的值。