What is the best way to check if a variable is a list?

This question already has an answer here:

  • What are the differences between type() and isinstance()? 6 answers

  • These all express different things, so really it depends on exactly what you wish to achieve:

  • isinstance(x, list) check if the type of x is either list or has list as a parent class (lets ignore ABCs for simplicity etc);
  • type(x) is list checks if the type of x is precisely list ;
  • type(x) == list checks for equality of types, which is not the same as being identical types as the metaclass could conceivably override __eq__
  • So in order they express the following:

  • isinstance(x, list) : is x like a list
  • type(x) is list : is x precisely a list and not a sub class
  • type(x) == list : is x a list, or some other type using metaclass magic to masquerade as a list .

  • Usually we prefer, isinstance(a, list) because it allows a to be either a list or list subclass.

    For better speed, an exact check can to an identity test, type(a) is list . This is a bit faster than using == .

    That said, the norm in Python is to avoid type checks altogether and instead do "duck typing". You call list methods on a and if they succeed, then we deem a to be sufficiently list like.


    Do you need to know if it's a list, or just if it's iterable (if you can use it in a for loop, for example)? Generally the "Pythonic way" is to just go ahead and do it in a try-except, because many things can be iterable: strings, lists, sets, deques, custom types, etc. (All it takes is an __iter__ or __getitem__ method)

    If you REALLY need to know what type it is, isinstance() is typically the way to go since it will also cover subclasses.

    As far as using type() == something is concerned, int , float , list , etc are all types: type(1) == int is True .

    My typical approach, where I might have a string, a list (or tuple, etc.) of strings, or an int or other object which can be converted to a string, would be this (for Python 2 - Py3 no longer has basestring so you'll need to check for str and/or bytes ), assuming foo is your variable:

    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/54224.html

    上一篇: Python中的函数参数类型

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