【问题标题】:Enumerating over list with strings gives wrong results用字符串枚举列表会给出错误的结果
【发布时间】:2020-06-24 14:37:19
【问题描述】:

看到这两个输出的结果不同,我感到很惊讶。这是为什么呢?

列表

numbers = ['01', '02', '03']
>>> for val in numbers:
...     print(val)
01
02
03

同时

>>> for i, val in numbers:
...     print(val)
1
2
3

【问题讨论】:

  • 可能是因为你没有enumerate(numbers)

标签: python list enumerate


【解决方案1】:

您无意中将字符串解压缩为 2 个变量:

a, b = "xy"
print(a)
print(b)
x
y

你真正想要的其实是enumerate他们:

for i, val in enumerate(numbers):
    print(val)
01
02
03

【讨论】:

    【解决方案2】:

    第二个循环将每个字符串解压缩为两个字符。如果你想得到类似的东西

    i val
    0 01
    1 02
    2 03
    

    那么你应该使用enumerate

    for i, val in enumerate(numbers):
        print(i, val)
    

    【讨论】:

      【解决方案3】:

      您将字符串拆分为两部分。第一个分配给i,第二个分配给val

      你正在做这样的事情:

      i, val = '01'
      

      改为尝试 python 的enumerate 进行枚举。

      查看字节码:

      >>> import dis
      >>> def foo(): a,b = 'ds'
      ... 
      >>> dis.dis(foo)
        1           0 LOAD_CONST               1 ('ds')
                    2 UNPACK_SEQUENCE          2         # <---
                    4 STORE_FAST               0 (a)
                    6 STORE_FAST               1 (b)
                    8 LOAD_CONST               0 (None)
                   10 RETURN_VALUE
      

      【讨论】:

        【解决方案4】:

        当您在一个变量中获取列表的字符串元素时。它将该元素完全分配给一个变量。

        numbers = ['01', '02', '03']
        for val in numbers:
            print(val)
        

        这里它给你 1,2,3 因为它按字节将字符串分配给两个变量:

        for i, val in numbers:
            print(val)
        1
        2
        3
        

        例如:

        像这样,当你在做的时候

        a,b = "89"
        print('a =', a)
        print('b =', b)
        

        它返回 a=8 和 b=9。我想你现在很清楚了。

        【讨论】:

          【解决方案5】:

          尝试枚举for循环

          for i, val in enumerate(numbers):
              print(val)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-08
            • 1970-01-01
            • 1970-01-01
            • 2018-04-07
            • 1970-01-01
            • 1970-01-01
            • 2010-09-19
            相关资源
            最近更新 更多