繁体   English   中英

Python清单初始化:[]与[[]]

[英]Python list initialization: [] vs. [[]]

我遇到了以下代码段(并且可以将其起源追溯到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=[]什么?

循环内的列表理解为:

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

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

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

[[]]没什么特别的。 只是cartesian_product正在执行的特定操作要求它对列表进行操作。 同样,如果您要编写一个函数,该函数采用列表中元素的均值,则需要确保列表中包含数字(因此添加它们很有意义)并且是非空的(因为否则,试图找到均值时将被零除)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM