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

时间:2017-03-30 01:24:48

标签: python list variables dictionary tuples

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

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?

3 个答案:

答案 0 :(得分:6)

这些都表达了不同的东西,所以它确实取决于你想要实现的目标:

  • 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 listx恰好是list是子类
  • type(x) == listx列表,或使用元类魔法伪装成list的其他类型。

答案 1 :(得分:0)

您是否需要知道它是否是列表,或者它是否可迭代(例如,如果您可以在for循环中使用它)?一般来说," Pythonic方式"是继续尝试 - 除非,因为很多东西都可以迭代:字符串,列表,集合,deques,自定义类型等等(所需要的只是__iter__或{{1}方法)

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

就使用__getitem__而言,type() == somethingintfloat等都是类型:listtype(1) == int

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

foo

答案 2 :(得分:0)

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

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

也就是说,Python中的规范是完全避免类型检查,而是"duck typing"。你在 a 上调用list方法,如果它们成功,那么我们认为 a 就足够了。