[英]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]
,其中x
是result
的元素。 这试图将result
元素添加到列表中。 因此,结果的每个元素都必须是一个列表。 这就是为什么将result
初始化为[[]]
,该列表具有一个元素,即一个列表(一个空列表)。 如果执行result = []
,则result
中没有任何元素,因此循环将立即结束并且不执行任何操作。
第二个示例是不同的,因为您对my_list
的元素不做任何事情。 您只需添加新元素。 另外,您无需遍历列表,因此不要求它包含任何内容。
[[]]
没什么特别的。 只是cartesian_product
正在执行的特定操作要求它对列表进行操作。 同样,如果您要编写一个函数,该函数采用列表中元素的均值,则需要确保列表中包含数字(因此添加它们很有意义)并且是非空的(因为否则,试图找到均值时将被零除)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.