Python列表初始化:[] vs. [[]]

Sac*_*n S 0 python python-3.x

我遇到了以下片段(并且可以追溯到https://docs.python.org/3/library/itertools.html#itertools.product):

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]]
Run Code Online (Sandbox Code Playgroud)

如果我们更改以下行:

result = [[]]
Run Code Online (Sandbox Code Playgroud)

对此:

result = []
Run Code Online (Sandbox Code Playgroud)

然后代码不起作用.

现在考虑下面的一段代码,其中变量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]]    
Run Code Online (Sandbox Code Playgroud)

所以在cartesian_product我上面提到的函数中,有result=[[]]和没有意义是result=[]什么?

Bre*_*arn 5

循环中的列表理解是:

[x+[y] for x in result for y in pool]
Run Code Online (Sandbox Code Playgroud)

这包含表达式x+[y],其中x是元素result.这会尝试将一个元素添加result到列表中.因此结果的每个元素都需要是一个列表.这就是为什么result初始化为[[]]一个包含一个元素的列表,它是一个列表(一个空列表).如果这样做result = [],则没有元素result,因此循环将立即结束并且不执行任何操作.

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

没什么特别的[[]].只是cartesian_product正在进行的特定操作要求它在列表列表上操作.类似地,如果您要编写一个函数,例如,列表中的元素的平均值,您需要确保列表中包含数字(因此添加它们是有意义的)并且是非空的(因为否则您当试图找到平均值时,要除以零.