【问题标题】:ValueError: too many values to unpackValueError:解包的值太多
【发布时间】:2015-11-06 02:55:15
【问题描述】:

为什么这段代码是错误的?

for i,j in range(100),range(200,300):
    print i,j

当我测试这个 for 语句时,我看到了这个错误

ValueError:解包的值太多

但是当我测试时

for i, j in range(2),range(2):
     print i,j

一切都是正确的!

【问题讨论】:

    标签: python loops


    【解决方案1】:

    range(2) 给出一个列表 [0, 1]。因此,您的 i, j 将从第一个列表中获取,然后从第二个列表中获取。

    所以,你的循环类似于:-

    for i, j in [0, 1], [0, 1]:
        print i, j
    

    打印:-

    0 1
    0 1
    

    现在,如果你在那里有range(3),那么它将失败,因为range(3) 给出了一个三元素列表,不能在two loop variables 中解包。

    所以,你不能这样做:-

    for (i, j) in [[0, 1, 2]]:
        print i, j
    

    它会失败,给你你得到的错误。

    尝试使用zip,将两个列表压缩为一个。:-

    >>> for (i, j) in (zip(range(2), range(3))):
        print i, j
    
    
    0 0
    1 1
    >>> 
    

    zip 在上述情况下将您的列表转换为具有2 元素的元组列表,因为您正在压缩 2 个列表。

    >>> zip(range(2), range(3))
    [(0, 0), (1, 1)]
    

    同样,如果你zip 三个列表,你会得到三元素元组的列表。

    【讨论】:

      【解决方案2】:

      range(200), range(300) 太长,无法查看,但我们可以通过查看 range(2), range(3) 来理解这种情况[1]

      iterable = (range(2), range(3))
      print(iterable)
      for i, j in iterable:
           print(repr(i))
      

      第一次打印

      ([0, 1], [0, 1, 2])    #<-- This is what your iterable looks like
      0
      

      然后加注

      ValueError: too many values to unpack
      

      在第一次循环中,i 等于 0,j 等于 1。 在第二遍中,i,j 被分配给[0,1,2]。显然有太多的值需要解压,因此例外。


      脚注[1]

      for i, j in range(2), range(3):
      

      等价于

      for i, j in (range(2), range(3)):
      

      相当于

      iterable = (range(2), range(3))
      for i, j in iterable:
      

      【讨论】:

        【解决方案3】:

        尝试使用zip

        for i, j in zip(range(2),range(2)):
             print i,j
        

        这只是 Python 语法。如果你想有两个循环变量,迭代对象必须包含长度为 2 的序列。但是,您的陈述与以下内容相同:

        i, j = range(100)
        

        您正在迭代序列[range(100), range(100)]。第一次迭代返回range(100),从前面的例子可以看出,这显然失败了。

        它适用于 range(2),因为它返回一个长度为 2 的序列,您的 i,j 语句可以解压到该序列。

        【讨论】:

        • 这是正确的,但你能解释一下吗?目前尚不清楚为什么会这样。
        猜你喜欢
        • 2016-05-11
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-28
        相关资源
        最近更新 更多