我遇到了一个问题,如这个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)只需要一个参数。但是,在列表中运行列表意味着什么呢?
发布于 2015-05-28 19:24:36
假设你有:
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
确保将所有对象复制为新对象。
发布于 2015-05-28 19:34:21
关于你的第二个问题,“本质上,我不明白的是list(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
发布于 2015-05-28 19:20:07
您正在使用list([0, 0])
创建一个新列表,而不是一次又一次使用相同的列表。
https://stackoverflow.com/questions/30515300
复制相似问题