为什么zip会改变我的列表?

时间:2016-10-11 13:50:51

标签: python list python-2.7 list-comprehension

我注意到(对我而言)非常奇怪的行为,我不明白: 我得到了一个列表和一个带有二进制值的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浮点数?这究竟是怎么发生的? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:16)

zip未更改您的列表。当您将名称ab分配给循环变量时,您丢失了对列表的初始引用:

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

一个简单的解决方法是将这些名称更改为ij

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

使用Python时要记住的一件事是名称绑定到对象,因此可以未绑定甚至反弹。没有名字是为了保持。一旦你更改了一个名称引用的对象,名称就会开始引用新对象。

另一方面,for循环将迭代中的对象分配给提供的名称,类似于常规赋值,但重复。因此,a循环末尾的bfor得到的值是上一次迭代中完成的最后一次赋值。

请记住这些。

答案 1 :(得分: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