2016-10-11 31 views
2

我注意到一個(對我來說)非常奇怪的行爲,我不明白: 我得到一個列表和一個numpy數組都有二進制值,我想檢查真正的正面(同時都是== 1) 。爲什麼zip會更改我的列表?

import numpy as np 
a = [0,0,1,1] 
b = np.array([1,0,1,0]) 

for a,b in zip(a,b): 
    if a==1 and b==1: 
     print "cool" 
print a,b 

現在瘋狂開始了。 a和b不再是一個列表或numpy數組,而是一個整數和numpy浮點數?究竟是如何發生的? 感謝您的幫助!

回答

15

zip沒有更改您的列表。你失去了你列出了初始的引用,當你在指定的名稱ab的循環變量:

for a, b in zip(a,b): 
# ^^ 

一個簡單的解決方法是改變那些名字說,ij

for i, j in zip(a,b): 

使用Python時要記住的一件事是名稱綁定到對象,因此可以是未綁定或甚至反彈。沒有名字是爲了保持。一旦你改變了一個名字像你一樣引用的對象,這個名字開始引用新的對象。

在另一個註釋中,for循環將迭代中的對象分配給提供的名稱,類似於常規分配,但是具有重複。因此,您在for循環結束時得到的ab的值是最後一次迭代中完成的最後一次賦值的值。

請牢記這些。

+1

非常感謝你,我忘了選擇不同的循環變量。我不知道分配發生在for循環中。我一直認爲循環只是創建它自己的命名空間,並在完成時拋出循環變量。很高興知道! – Pepe

2

假設a是一個列表,並且你寫了a = a[0]。現在您會預計a不是列表,而是列表中的第一個值。

同樣,當你編寫for a,b in zip(a,b)時,你重新指定ab來保存每個迭代中的第一個元素。試試:

for x,y in zip(a,b): 
    if x==1 and y==1: 
     print "cool" 
print a,b 
相關問題