2017-07-17 81 views
0

我碰到下面的代码片段来(和可以跟踪其原产地https://docs.python.org/3/library/itertools.html#itertools.product):Python列表初始化:[]对[[]]

def cartesian_product(pools): 
    result = [[]] 
    for pool in pools: 
     result = [x+[y] for x in result for y in pool] 
    return result 

a_list=[1, 2, 3] 
b_list=[4, 5] 
all_list=[a_list, b_list] 

print (cartesian_product(all_list)) # [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]] 

如果我们改变了以下行:

result = [[]] 

对此:

result = [] 

然后代码不起作用。

现在考虑下面的代码,其中的变量my_list初始化为my_list=[],而不是my_list=[[]],但我们仍然得到预期的结果:

my_list=[] 
my_list.append([1,2]) 
my_list.append([3,4]) 
print (my_list) # [[1, 2], [3, 4]]  

所以在功能cartesian_product我上面提到的,有什么意义有result=[[]]而不是result=[]

+2

你确实注意到它遍历'result',对吧? –

+0

如果'result'为空,'for result in'result'不会执行任何操作。 '[[]]'不是一个空列表,因此它做了一些不同的事情。 –

回答

5

循环中的列表理解是:

[x+[y] for x in result for y in pool] 

这包含表达x+[y],其中xresult的元件。这会尝试将result的元素添加到列表中。所以结果的每个元素都需要成为一个列表。这就是为什么result初始化为[[]],这是一个列表,其中有一个元素,它是一个列表(一个空列表)。如果你做result = []result中没有元素,所以循环将立即结束并且什么都不做。

你的第二个例子是不同的,因为你不用my_list的元素做任何事情。你只需添加新的元素。此外,您不会遍历列表,因此不需要包含任何内容。

没有什么特别的关于[[]]。只是cartesian_product正在做的特定操作要求它在列表中进行操作。同样,如果你要编写一个函数,比如列表中元素的平均值,你需要确保列表中包含数字(所以添加它们是有意义的)并且不是空的(因为否则你当试图找到平均值时,将被除以零)。