我注意到(对我而言)非常奇怪的行为,我不明白: 我得到了一个列表和一个带有二进制值的numpy数组,我想检查真正的正数(同时= = 1)。
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浮点数?这究竟是怎么发生的? 谢谢你的帮助!
答案 0 :(得分:16)
zip
未更改您的列表。当您将名称a
和b
分配给循环变量时,您丢失了对列表的初始引用:
for a, b in zip(a,b):
# ^ ^
一个简单的解决方法是将这些名称更改为i
和j
:
for i, j in zip(a,b):
使用Python时要记住的一件事是名称绑定到对象,因此可以未绑定甚至反弹。没有名字是为了保持。一旦你更改了一个名称引用的对象,名称就会开始引用新对象。
另一方面,for
循环将迭代中的对象分配给提供的名称,类似于常规赋值,但重复。因此,a
循环末尾的b
和for
得到的值是上一次迭代中完成的最后一次赋值。
请记住这些。
答案 1 :(得分:2)
假设a
是一个列表,您编写a = a[0]
。现在,您希望a
不是列表,而是列表中的第一个值。
同样,当您编写for a,b in zip(a,b)
时,您会重新分配a
和b
来保存每个可迭代中的第一个元素。尝试:
for x,y in zip(a,b):
if x==1 and y==1:
print "cool"
print a,b