【问题标题】:Why does zip change my lists? [duplicate]为什么 zip 会更改我的列表? [复制]
【发布时间】:2017-02-20 02:09:18
【问题描述】:

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

【问题讨论】:

    标签: python list python-2.7 list-comprehension


    【解决方案1】:

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

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

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

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

    使用 Python 时要记住的一点是,名称绑定到对象,因此可以是 unbound 甚至是 rebound。没有名字是为了保持。一旦您更改了名称所引用的对象,就像您所做的那样,该名称开始引用新对象。

    另一方面,for 循环将可迭代对象中的对象分配给提供的名称,类似于常规分配,但有重复。因此,您在 for 循环结束时为 ab 获得的值是在上一次迭代中完成的最后一次赋值的值。

    记住这些。

    【讨论】:

    • 非常感谢,我忘记选择不同的循环变量了。我不知道分配发生在 for 循环中。我一直认为循环只是创建它自己的命名空间,并在完成后将循环变量扔掉。很高兴知道!
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2021-01-16
      • 2012-08-13
      • 2020-09-24
      • 2021-10-18
      相关资源
      最近更新 更多