2014-11-08 46 views
0

在Python for loop在for循環中使用range()時,列表實例化的過程是什麼?

for x in range(100): 
    print x 

使用時,我想了解一下該range()功能範圍是否進入循環前初始化整個國際熱核實驗堆能夠名單還是足夠聰明,因爲它增加產生的價值?

換句話說,如果我說的。會有像這樣的很大範圍的開銷嗎?

for x in range(1000**1000): 
     value = x 
+0

在哪個目錄/文件,我可以看到的範圍()的實現?我想了解Python如何工作,但我不知道從哪裏開始閱讀代碼。 – Matt 2014-11-08 23:15:14

+1

@馬特,你可以看到它[這裏](https://hg.python.org/cpython/file/tip/Objects/rangeobject.c)爲CPython的執行 – jonrsharpe 2014-11-09 09:18:29

+0

@DSM指出,由於 – jonrsharpe 2014-11-09 09:21:56

回答

2

這依賴於Python版本:

  • 在Python 3,range()是發電機狀物體對按需生成的值。
  • 在Python 2中,range()創建了物化列表。如果你想要一個類似發電機的物體,請使用xrange()
+2

這是一個有點迂腐,但Python 3的'range'實際上並不是一個生成器或迭代器,這就是爲什麼你可以立即執行'10 ** 1000範圍(10 ** 999)',爲什麼'next(range(10))'會生成' TypeError:'range'對象不是迭代器。 – DSM 2014-11-08 23:11:45

1

在有任何疑問時,很容易檢查。在IDLE中(例如使用Python 3.3):

>>> r = range(10) 
>>> print(r) 
range(0, 10) 
>>> print(list(r)) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
1

是的!如果使用range(),python會在進入循環之前初始化整個iter-able列表。但是有一個簡單的方法可以使用xrange()來克服這個開銷,隨着它的增加它會生成值。這可以被驗證爲:

>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> xrange(10) 
xrange(10) 
+0

不在Python 3中。 – rightfold 2014-11-08 23:10:02

相關問題