关于python:检查变量是否是列表的最佳方法是什么?

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

本问题已经有最佳答案,请猛点这里访问。

我找到了3种检查方法,但我不知道哪一种是最好的:

1
2
3
4
5
x = ['Bla', 'Bla', 'Bla', 'etc']

if isinstance(a, list): print('Perfect!')
if type(a) is list:     print('Incredible!')
if type(a) == type([]): print('Awesome!')

哪个更好?

另外,我可以用这些方法来检查x是否是字符串、元组、字典、int、float等?如果可能的话,在前两个方法中,我是否必须将列表转换为元组、字符串、字典、int、float等(否?)但是第三次呢?我必须使用(),,'',还有什么关于int和float的?


这些都表达了不同的东西,所以真正的情况取决于你想要实现什么:

  • isinstance(x, list)检查x的类型是list还是有list作为父类(为了简单起见,让我们忽略abcs等);
  • type(x) is list检查x的类型是否精确为list
  • type(x) == list检查类型是否相等,这与作为元类的相同类型不同,因为可以想象,元类可以覆盖__eq__

因此,为了表达以下内容:

  • isinstance(x, list)xlist吗?
  • type(x) is listx正是list而不是一个子类吗?
  • type(x) == listx是一个列表,还是使用超类魔法伪装成list的其他类型?


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

为了提高速度,可以对身份测试进行精确的检查,type(a) is list。这比使用==快一点。

也就是说,Python的标准是完全避免类型检查,而是执行"duck-typing"。您在上调用了List方法,如果它们成功了,那么我们认为a足够类似于List。


您需要知道它是一个列表,还是仅仅知道它是一个不可访问的列表(例如,如果您可以在for循环中使用它)?一般来说,"pythonic方法"只是在一次尝试中进行,除了,因为许多事情都是可以重复的:字符串、列表、集合、deques、自定义类型等(只需要一个__iter____getitem__方法)。

如果您真的需要知道它是什么类型,isInstance()通常是一种方法,因为它还将覆盖子类。

就使用type() == something而言,int型、float型、list型等均为:type(1) == int型为True型。

我的典型方法是,使用字符串、字符串列表(或元组等)、int或其他可以转换为字符串的对象(对于python 2-py3,不再使用basestring,因此需要检查str和/或bytes,假设foo是您的变量:

1
2
3
4
5
6
7
8
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))