我在使用zip命令获得预期结果时遇到了一些麻烦。案例1-3是有道理的,但在第4和第5案例中(我假设它们是等价的?)我希望结果是[['a'],['b'],['c'],['d' ]],而是将整个第二个列表附加到我初始化的列表列表的每个子列表中。
案例1:
>>> for a in zip([1,2,3,4],['a','b','c','d']):
... print a
(1, 'a')
(2, 'b')
(3, 'c')
(4, 'd')
案例2:
>>> for (a,b) in zip([1,2,3,4],['a','b','c','d']):
... print a,b
...
1 a
2 b
3 c
4 d
案例3:
>>> temp = [[]] * 4
>>> for (a,b) in zip([0,1,2,3],['a','b','c','d']):
... temp[a] = b
...
>>> temp
['a', 'b', 'c', 'd']
案例4:
>>> temp = [[]] * 4
>>> for (a,b) in zip([0,1,2,3],['a','b','c','d']):
... temp[a].append(b)
...
>>> temp
[['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd']]
案例5:
>>> temp = [[]] * 4
>>> for a,b in zip([0,1,2,3],['a','b','c','d']):
... temp[a].append(b)
...
>>> temp
[['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd']]
答案 0 :(得分:3)
[[]] * 4
创建对单个对象的引用列表:
>>> l = [[]] * 4
>>> l
[[], [], [], []]
>>> l[0].append(1)
>>> l
[[1], [1], [1], [1]]
请尝试[[] for _ in range(4)]
。
答案 1 :(得分:1)
temp = [[]] * 4
这将创建一个列表,其中包含对同一列表对象的四个引用。您只有一个“子列表”在“主列表”中包含四次。这与此示例中的情况相同:
>>> ls = []
>>> tmp = [ls, ls, ls, ls]
>>> ls.append(1)
>>> tmp
[[1], [1], [1], [1]]
您可能希望为列表元素使用单独的列表对象。例如,可以通过这种方式创建这样的列表:
tmp = [[] for _ in range(4)]
答案 2 :(得分:1)
你遇到了Python处理变量名和引用的方式。如果您以前使用过C风格的语言,可能会让人感到困惑,但如果您不这么认为,那就很有意义了!
Python有“东西”和“事物名称”。例如,x
是一个名称,[]
是一个东西,x=[]
将名称x
分配给事物[]
。
列表乘法语法在名称和事物方面有点令人困惑。让我们把它展开来看看它是如何工作的:
name = [x]*4
与
相同_temp = x name = [_temp, _temp, _temp, _temp]
考虑到这一点,以下代码应该有意义:
>>> x = []
>>> y = [x]*4
>>> y[0].append(1)
>>> y
[[1], [1], [1], [1]]
为什么呢?好吧,当你写y=[x]*4]
时,你会列出四个名字。但这些都是相同事物的名字!如果.append(1)
指向由名字命名的对象,则更改所有名称的对象,即名称。
现在,和以前一样,
name = [[]]*4
与
相同_temp = [] name = [_temp, _temp, _temp, _temp]
您尚未明确创建新名称。但你已经这样做了含蓄地!您只需拨打[]
一次,因此您只需制作一个新列表。然后,您可以列出四个名称,每个名称都是您刚刚创建的新空列表。因此,所有名字都指出同样的事情也就不足为奇了!
你说怎么解决这个问题?好吧,您需要为所需的每个新列表调用[]
一次。为此,请使用列表解析:
[[] for _ in range(4)]
请注意,_
只是另一个名称,尽管它通常用于您不关心的事情。
答案 3 :(得分:0)
这是因为当您创建temp = [[]] * 4时,您创建一个列表,其中包含对同一(空)列表的4个引用。