检查变量是否为列表的最佳方法是什么?

这个问题在这里已经有了答案:

  • type()和isinstance()之间有什么区别? 6个答案

  • 这些都表达了不同的东西,所以真正取决于你想要达到的目标:

  • isinstance(x, list)检查x的类型是list还是list作为父类(为简单起见,忽略ABC);
  • type(x) is list检查x的类型是否精确list ;
  • type(x) == list检查类型是否相同,与元类可能会覆盖__eq__
  • 所以为了表达以下内容:

  • isinstance(x, list) :是xlist
  • type(x) is listx正好是一个list而不是一个子类
  • type(x) == list :是x的列表,或使用元类魔法伪装成一些其它类型的list

  • 通常我们更喜欢isinstance(a, list)因为它允许a是列表或子列表子类。

    为了更好的速度,一个确切的检查可以进行身份​​测试, type(a) is list 。 这比使用==快一点。

    也就是说,Python中的规范是完全避免类型检查,而是进行“鸭子打字”。 你可以在列表中调用列表方法,如果它们成功了,那么我们认为它足够像列表一样。


    你需要知道它是否是一个列表,或者只是它是可迭代的(例如,如果你可以在for循环中使用它)? 一般来说,“Pythonic方式”只是继续前进并尝试,除此之外,因为很多事情都可以迭代:字符串,列表,集合,deques,自定义类型等等(它只需要一个__iter____getitem__方法)

    如果你真的需要知道它是什么类型,isinstance()通常是要走的路,因为它也会覆盖子类。

    就使用type() == something而言, intfloatlist等都是类型: type(1) == intTrue

    我典型的方法,我可能有一个字符串,一个列表(或元组等)的字符串,或一个int或其他对象,可以转换为一个字符串,这将是(对于Python 2 - Py3不再有basestring所以你需要检查str和/或bytes ),假设foo是你的变量:

    if isinstance(foo, basestring):
        foo = (foo,) # turn it into an iterable (tuple)
        # or, doStuff(foo) followed by a return or break
    try:
        for x in foo:
            doStuff(str(x)) # do something with each element
    except TypeError: # TypeError: 'some' object is not iterable
        doStuff(str(foo))
    
    链接地址: http://www.djcxy.com/p/54223.html

    上一篇: What is the best way to check if a variable is a list?

    下一篇: Difference between isinstance and type in python