[英]outputs of different list comprehensions in python 3.x
我正在研究 Python 中的列表理解,我很困惑為什么這兩個代碼會產生不同的輸出。 代碼:
print([(letter,num) for letter in 'abc' for num in range(2)])
print([((letter,num) for letter in 'abc') for num in range(2)])
OUTPUT:
[('a', 0), ('a', 1), ('a', 2), ('a', 3), ('b', 0), ('b', 1), ('b', 2), ('b', 3), ('c', 0), ('c', 1), ('c', 2), ('c', 3), ('d', 0), ('d', 1), ('d', 2), ('d', 3)]
[<generator object <listcomp>.<genexpr> at 0x000002919E020F20>, <generator object <listcomp>.<genexpr> at 0x000002919E148C10>, <generator object <listcomp>.<genexpr> at 0x000002919E1489E0>, <generator object <listcomp>.<genexpr> at 0x000002919E148C80>]
第一個例子:
print([(letter,num) for letter in 'abc' for num in range(2)])
打印一個列表(因為外部[]
括號),其中包含 letter 和num
的所有元組(因為letter
和letter, num
周圍的括號),每個letter
的值在'abc'
上循環, num
的每個值在每個值上循環range(2)
返回的生成器的值(將是0
和1
)。
由於 Python 將第一個for
作為外循環,因此您會看到('a', 0), ('a', 1),
等,而不是('a', 0), ('b', 0),
等.
但是,當您在for
表達式(如(letter,num) for letter in 'abc'
周圍添加括號時,您不再在理解中執行循環,而是捕獲生成器(准備開始產生它們的值,但實際上並沒有將值納入理解中)。
所以:
print([((letter,num) for letter in 'abc') for num in range(2)])
在這里, ((letter,num) for letter in 'abc')
只是一個生成器,一旦你開始請求它們就會產生值。
注意:因為num
的值沒有單獨包含在生成器中,如果你對它們做一些事情,你可能會看到一個令人驚訝的結果:
x = [((letter,num) for letter in 'abc') for num in range(2)]
print(next(x[0]))
print(next(x[0]))
print(next(x[0]))
print(next(x[1]))
print(next(x[1]))
print(next(x[1]))
結果:
('a', 1)
('b', 1)
('c', 1)
('a', 1)
('b', 1)
('c', 1)
第一個列表推導等效於嵌套循環:
result = []
for num in range(2):
for letter in 'abc':
result.append((letter, num))
print(result)
嵌套循環的每次迭代都會產生結果列表的一個元素。
第二個相當於一個循環:
result = []
for num in range(2):
result.append((letter, num) for letter in 'abc')
print(result)
循環的每次迭代都會將生成器 object 附加到結果列表中。
您可以使用嵌套列表推導,但結果將是嵌套列表,而不是第一個版本中的平面列表。
print([list((letter,num) for letter in 'abc') for num in range(2)])
# output: [[('a', 0), ('b', 0), ('c', 0)], [('a', 1), ('b', 1), ('c', 1)]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.