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

时间:2017-07-17 03:58:21

标签: 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]]

如果我们更改以下行:

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=[]的重要性是什么?

1 个答案:

答案 0 :(得分:5)

循环内的列表理解是:

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

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

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

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