【问题标题】:list(enumerate(x)) sometimes work and sometimes throws an errorlist(enumerate(x)) 有时会起作用,有时会抛出错误
【发布时间】:2020-12-27 04:46:47
【问题描述】:

我理解 python 中的 enumerate() 函数,但是我发现了一个奇怪的行为。对于像

这样的列表
x = ["foo", "bar", "baz"]

enumerate(x) 创建一个枚举对象并检索元素,我们需要使用 list() 函数。 当我使用

list(enumerate(x))

我遇到了一个错误

TypeError: 'list' object is not callable.

奇怪的是(这让我更担心),在尝试了一段时间后,我放弃了它并转向了其他事情。 同样,当我开始运行相同的代码(完全没有变化)时,它运行得非常好,我得到了如下的输出(这也是我们所期望的)

[(0, 'foo'), (1, 'bar'), (2, 'baz')]

当我下次再次看到时(可能在我的下一个会话中),问题变得更加奇怪,代码产生了错误,现在你可能已经猜到我的痛苦了,它在下一个会话中再次起作用。

有没有人在函数有时工作而其他时候抛出错误时遇到过此类问题? 在这种情况下可以做什么?我错过了什么吗?

我用的是 Google Colab,相信没关系。

编辑:应@ZF007 在 cmets 中的要求,我在 Windows 机器上使用 Colab 的免费版本,Python 版本是 - 3.6.9

This 显示错误,而之前相同的代码正在运行。

正如@Grismar 和@Frank 所指出的那样,可能有其他东西在幕后干扰 list(enumerate(x))。

正如我之前提到的,代码现在可以工作了,所以我没有尝试其他任何事情,比如更改 IDE。

谢谢

【问题讨论】:

  • 我希望它可能是缺少小语法或可能是 Colab 问题
  • 沿着这条线的某个地方,您将“列表”从内置的list 类反弹到列表的实例。 list = [1,2,3] 或类似的东西。确保不要将内置对象的名称用作变量。
  • 您确定错误出现在这一行? list(enumerate(x)) 的结果是否可能会意外地被用作函数?您是否将此列表分配给意外覆盖内部函数的变量名称?
  • @NanthakumarJJ 恐怕不是。因为我没有更改代码中的任何内容。
  • 你的问题得到了反对票,因为一旦人们提出了可能的原因,你就没有提供关于你尝试了什么的反馈——就像 Python 不会神奇地决定第一次做一件事,下一次做另一件事,你不能指望这里的人会神奇地推断出你的情况。我仍然认为答案是给定的,因为您没有提供进一步的证据,而且这肯定是最有可能的。

标签: python python-3.x google-colaboratory enumerate


【解决方案1】:

cmets 中的一些人已经指出,这个错误很可能是由于重新定义了 list,它“遮蔽”了原始定义。

例如:

x = ["foo", "bar", "baz"]

# this works, but redefines list
list = list(enumerate(x))

# this no longer works, since `list` is now the list created in the previous line
list = list(enumerate(x))

当执行最后一行时你会看到这个错误:

Traceback (most recent call last):
  File "<script filename>", line 7, in <module>
    list = list(enumerate(x))
TypeError: 'list' object is not callable

顺便说一句:您注意到“enumerate(x) 创建了一个枚举对象并检索元素,我们需要使用 list() 函数”。也许您已经知道,但是 enumerate 返回一个您可以通过多种方式使用的可迭代对象,将其传递给 list() 函数确实会返回列表中的内容,但您也可以(例如)直接在 for 循环中使用它:

for i, obj in enumerate(x):
    print(f'{ob} is number {i}')

【讨论】:

  • 谢谢,但正如我提到的,我没有使用任何内置名称。我只是在打印 list(enumerate(x))
  • 由于您报告的行为是间歇性的,也许在您不知情的情况下有其他东西正在重新定义它。当你下次遇到这个问题时,你最好对print(list)print(type(list))进行处理,这样你就可以知道list当时实际上是什么。
  • 观看视频。很明显,有些事情正在重新定义“列表”。没有其他解释。正如@Grismar 指出的那样,下次你看到这个时,试着打印出list 的值,看看你得到了什么。
  • 谢谢,会检查的。
猜你喜欢
  • 2016-06-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多