6 回答
TA贡献1851条经验 获得超4个赞
实际上,这正是您所期望的。让我们分解这里发生的事情:
你写
lst = [[1] * 4] * 3
这相当于:
lst1 = [1]*4lst = [lst1]*3
这意味着lst
是一个包含3个元素的列表lst1
。这意味着以下两行是等效的:
lst[0][0] = 5lst1[0] = 5
就像lst[0]
什么一样lst1
。
要获得所需的行为,您可以使用列表理解:
lst = [ [1]*4 for n in xrange(3) ]
在这种情况下,对每个n重新计算表达式,从而得到不同的列表。
TA贡献1816条经验 获得超4个赞
[[1] * 4] * 3
甚至:
[[1, 1, 1, 1]] * 3
创建一个引用内部[1,1,1,1]3次的列表- 而不是内部列表的三个副本,因此每次修改列表(在任何位置)时,您都会看到三次更改。
它与此示例相同:
>>> inner = [1,1,1,1]
>>> outer = [inner]*3
>>> outer
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> inner[0] = 5
>>> outer
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
它可能不那么令人惊讶。
TA贡献1818条经验 获得超11个赞
除了正确解释问题的接受答案之外,在列表理解中,如果使用python-2.x xrange()
,则返回一个更有效的生成器(range()
在python 3中执行相同的工作)_
而不是一次性变量n
:
[[1]*4 for _ in xrange(3)] # and in python3 [[1]*4 for _ in range(3)]
此外,作为更多Pythonic方式,您可以使用它itertools.repeat()
来创建重复元素的迭代器对象:
>>> a=list(repeat(1,4))[1, 1, 1, 1]>>> a[0]=5>>> a[5, 1, 1, 1]
PS使用numpy的,如果你只是想创建1或0,你可以使用数组np.ones
和np.zeros
和/或其他使用次数np.repeat()
:
In [1]: import numpy as npIn [2]: In [2]: np.ones(4)Out[2]: array([ 1., 1., 1., 1.])In [3]: np.ones((4, 2))Out[3]: array([[ 1., 1.], [ 1., 1.], [ 1., 1.], [ 1., 1.]])In [4]: np.zeros((4, 2))Out[4]: array([[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]])In [5]: np.repeat([7], 10)Out[5]: array([7, 7, 7, 7, 7, 7, 7, 7, 7, 7])
TA贡献1780条经验 获得超1个赞
简单来说,这种情况正在发生,因为在python中一切都通过引用工作,所以当你创建一个列表列表时,你基本上会遇到这样的问题。
要解决您的问题,您可以执行以下任一操作:1。对numpy.empty使用numpy数组文档 2.在到达列表时附加列表。如果你愿意,你也可以使用字典
TA贡献1845条经验 获得超8个赞
添加回答
举报