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) :x 像list 吗?type(x) is list :x 正是list 而不是一个子类吗?type(x) == list :x 是一个列表,还是使用超类魔法伪装成list 的其他类型?
通常我们更喜欢
为了提高速度,可以对身份测试进行精确的检查,
也就是说,Python的标准是完全避免类型检查,而是执行"duck-typing"。您在上调用了List方法,如果它们成功了,那么我们认为a足够类似于List。
您需要知道它是一个列表,还是仅仅知道它是一个不可访问的列表(例如,如果您可以在for循环中使用它)?一般来说,"pythonic方法"只是在一次尝试中进行,除了,因为许多事情都是可以重复的:字符串、列表、集合、deques、自定义类型等(只需要一个
如果您真的需要知道它是什么类型,isInstance()通常是一种方法,因为它还将覆盖子类。
就使用
我的典型方法是,使用字符串、字符串列表(或元组等)、int或其他可以转换为字符串的对象(对于python 2-py3,不再使用
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)) |