每日一讀:《關於python2和python3中的range》
官網原話是這麽說的:
In many ways the object returned by range() behaves as if it is a list, but in fact it isn’t. It is an object which returns the successive items of the desired sequence when you iterate over it, but it doesn’t really make the list, thus saving space.
We say such an object is iterable, that is, suitable as a target for functions and constructs that expect something from which they can obtain successive items until the supply is exhausted. We have seen that the for statement is such an iterator. The function list() is another; it creates lists from iterables:
翻譯:
可以看到上面這個很奇怪, 在很多種情況下, range()函數返回的對象的行為都很像一個列表, 但是它確實不是一個列表,它只是在叠代的情況下返回指定索引的值, 但是它並不會在內存中真正產生一個列表對象, 這樣也是為了節約內存空間。
我們稱這種對象是可叠代的,或者是可叠代對象,還有一種對象叫叠代器, 它們需要從一個可叠代對象中連續獲取指定索引的值, 一直到索引結束。list()函數就是這樣一個叠代器,它可以把range()函數返回的對象變成一個列表。
總結:
range() 函數返回的是一個可叠代對象(類型是對象),而不是列表類型, 所以打印的時候不會打印列表。
list() 函數是對象叠代器,把對象轉為一個列表。返回的變量類型為列表。
如:for i in range(1,5)在python2和python3中都可以使用,但是要生成1-5的列表, python3中就需要用list(range(1,5))。如下面的代碼:
i=range(1,5)
print i
我們在python2.7中運行一切正常,和我們想要的結果是一致的。 返回的是一個列表:
[1, 2, 3, 4]
我們type(i)返回的是list,也是正確的。
但如果我們要在python3中,如果這樣做呢?會和我們想要的結果一樣嗎?
我們把以上代碼復制並在python3中運行。發現返回的是
range(1, 5)
而不是我們想要的結果:[1,2,3,5] 。這也就證明了在python3中,range返回的是一個叠代值。
而我們想要返回一個列表,我們就要這樣做:
i=list(range(1,5))
print(i)
在range前面加多一個list函數。
每日一讀:《關於python2和python3中的range》