簡體   English   中英

列出理解和一行for循環

[英]List comprehensions and one line for-loops

如果您執行此列表理解:

squares = [x**2 for x in range(100000)]

這會占用大量內存,因此您可以使用生成器來做同樣的事情:

squares = (x**2 for x in range(100000))

現在假設我要使用單行for循環來打印所有這些正方形:

[print(square) for square in squares]

我的問題是 :是否以這種方式打印以創建列表(看起來像列表理解)? 如果是這樣,該列表是否存儲在內存中? (如果這樣做,則在創建squares時使用生成器是沒有意義的,因為無論如何它們都將存儲在另一個列表中。)還有另一件事:如果這樣做:

[1, 2, 3, 4, 5, 6]

在不將其分配給任何變量的情況下,這些值是否存儲在內存中?

如果不為列表分配名稱,該列表將不會存儲在內存中,因為沒有引用保存該列表(最初, 為其分配內存,但是由於(C)Python可以看到您沒有使用它,因此它立即被釋放*) 。

除此之外,還可打印:

[print(square) for square in squares]

效率極低; 您正在使用列表理解只是印刷的副作用 ,即持有的結果列表print函數調用(它的返回值)填充。

這意味着您將得到一個None列表,該列表的創建只是為了轉儲 ,而沒有太多用處。

最好使用帶有for循環的生成器,如@ user312016在他的答案中建議的那樣。 生成器將按需產生,並且不會創建額外的列表。

*在交互模式下,情況有所不同,因為您將名稱_用作最近計算的表達式的名稱。 在那里,列表存儲在內存中,直到下一個表達式覆蓋_附加的值為止。

是的,這是創建一個list並將其存儲在內存中,您不應將列表推導用作循環的單行,這不是它們的用途。

您可以這樣做:

for square in (x**2 for x in range(100000)):
    print(square)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM