2013-07-21 18 views
7

的Python 3.2.3,使用空閒,Python的殼拉鍊第一次使用後可變空

t = (1,2,3) 
t2 = (5,6,7) 
z = zip(t,t2) 

for x in z : 
    print(x) 

結果: (1,5) (2,6) (3,7)

在完全相同的循環代碼將在for循環再次顯示Z,(做上述和下部分之間沒有任何東西)後立即:

for x in z : 
    print(x) 

結果: (空白,如無結果)

ž依然存在,如

z 

結果

<zip object at 0xa8d48ec> 

我甚至可以重新分配T,T2再次拉上,但隨後只有一次,只有一次,再次。

這是它應該如何工作? Theres在文檔http://docs.python.org/3.2/library/functions.html#zip中沒有提到這一點。

回答

10

這就是它在python 3.x中的工作原理。在python2.x中,zip返回元組列表,但對於python3.x,zip的行爲與的行爲在python2.x中相同。爲了恢復python2.x行爲,只是從zip的輸出構建一個列表:

z = list(zip(t,t2)) 

注意,在python3.x,大量的內置函數現在返回迭代器而不是列表(mapzipfilter

6

因爲zip在Python 3.x中返回一個迭代器。如果你想重新使用它,然後讓它list第一:

z = list(zip(t, t2)) 
+0

迭代器,而不是發生器。 – user2357112

+0

@ user2357112 ty ... –

3

zip返回迭代器(在Python 3)。你只能迭代一次迭代器。當元素超出元素時,迭代器不會消失,但是再次迭代它會得到0個元素。如果你想要一個列表,請撥打list就可以了:

z = list(zip(t, t2))