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

Pic*_*ard 3 python list-comprehension list python-2.7

我注意到(对我来说)非常奇怪的行为,我不明白:我有一个列表和一个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
Run Code Online (Sandbox Code Playgroud)

现在疯狂开始了.a和b不再是列表或numpy数组,而是整数和numpy浮点数?这究竟是怎么发生的?谢谢你的帮助!

Mos*_*oye 16

zip没有改变你的清单.在分配名称ab循环变量时,您丢失了对列表的初始引用:

for a, b in zip(a,b):
#   ^  ^
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方法是更改​​这些名称,i并且j:

for i, j in zip(a,b):
Run Code Online (Sandbox Code Playgroud)

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

另一方面,for循环将迭代中的对象分配给提供的名称,类似于常规赋值,但重复.所以,你得到的价值ab在年底for环是那些在最后一次迭代完成两次分配的.

请记住这些.