【问题标题】:enumerate(list) removes items from a list and convert it to string/intenumerate(list) 从列表中删除项目并将其转换为字符串/整数
【发布时间】:2018-09-19 12:44:48
【问题描述】:

这个问题只是出于好奇。假设我有列表x

   x = ['a', 'b', 'c', 'd', 'e']

当我列举了这个列表并犯了如下的预期错误时:

  for i, x in enumerate(x):
      print i + " : " + x 
      #Should use str(i) and str(x)

可以预见会产生这个错误:

    Traceback (most recent call last):
      File "<pyshell#26>", line 2, in <module>
        print i + " : " + x
    TypeError: unsupported operand type(s) for +: 'int' and 'str'

但是x 列表被转换为一个字母字符串'a'

  print x
  'a'

我尝试将数字列表x = [1, 2, 3, 4]x 转换为1 的整数。

为什么会这样?为什么我使用 str(i) 和 str(x) 时没有发生?

【问题讨论】:

  • 因为字符串不能加成整数。
  • 整数为计数器,i,错误信息中的字符串为':'x 在这两种情况下都是一个字符串。从未从列表中删除任何内容。一旦您尝试将i 添加到':',它就已经失败了,因此它不会再尝试在此之上添加x
  • 等一下,您的列表名为x,您还将列表中的值分配给名称x。那是名字的冲突。运行循环后,将名称 x 重新绑定到列表中的第一项。
  • @roganjosh:注意:它将“工作”,因为循环将运行到完成,因为x 的旧值作为for 循环设置的一部分被有效地缓存。也就是说,是的,在循环开始后对 x 的任何引用都将不再引用原始的可迭代对象,因此虽然它“有效”,但几乎肯定会令人困惑/容易出错。
  • roganjosh 已经解释了由于重复使用名称x 而导致的错误,但无论如何,让print 处理转换为字符串和连接会更有效,例如print i, ':', y跨度>

标签: python python-2.7 for-loop enumerate


【解决方案1】:

enumerate 的问题在这里让人分心。真正的问题是您有一个名为x 的列表,然后您在for 循环中将列表中的值within 分配给名称x

在您到达以下位置之前,代码实际上不会崩溃:

print i + " : " + x 

嗯,到那时,名称的重新绑定已经发生在上一行:

for i, x in enumerate(x):

现在x 指向不同的对象——列表中的第一项,无论它是字符串还是整数。重命名您的列表或循环变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多