Isinstance()不起作用

时间:2012-04-14 06:06:33

标签: python

出于某种原因,我无法使用isinstance()来使用Python 2.7.2

def print_lol(the_list, indent=False, level=0):
    for item in the_list:
        if isinstance(item, list):
            print_lol(item, indent, level+1)
        else:
            print(item)

当我编译并运行它时:

>>> list = ["q", "w", ["D", ["E", "I"]]]
>>> print_lol(list)

我收到错误消息:

if isinstance(item, list):
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

我在想什么?

4 个答案:

答案 0 :(得分:8)

您已将变量命名为list

>>> list = ["q", "w", ["D", ["E", "I"]]]

隐藏了内置list

重命名变量后,重新启动Python(或IDE)。由于您的list是一个全局变量,否则它将保持不变。

答案 1 :(得分:2)

这是您遇到问题的地方

>>> list = ["q", "w", ["D", ["E", "I"]]]

覆盖python命名类型,如list,将变量名称与新对象实例绑定。所以后来当你尝试使用list实例时,它失败了。

当您创建新变量时,请不要以与内置命名不同的方式命名它,也不要与命名空间冲突。

在此示例中,使用以下内容将像微风一样工作

>>> mylist = [w for w in mylist if len(w) >= 3 and diff(w)]
>>> isinstance(mylist,list)
True

请注意,如果您已经污染了命名空间并且您正在IDLE中运行,那么重新启动IDLE是一个不错的选择。

答案 2 :(得分:1)

问题是您通过分配名为list的变量隐藏了内置list

list = ["q", "w", ["D", ["E", "I"]]]

您应该尽量避免对变量使用任何内置名称,因为这通常会导致混淆错误。解决方案是为变量使用不同的名称。

答案 3 :(得分:1)

您正在覆盖list,请在print list之前尝试isinstance来诊断此类问题。