检查变量是否为列表的最佳方法是什么?
这个问题在这里已经有了答案:
这些都表达了不同的东西,所以真正取决于你想要达到的目标:
isinstance(x, list)
检查x
的类型是list
还是list
作为父类(为简单起见,忽略ABC); 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
。 通常我们更喜欢isinstance(a, list)
因为它允许a是列表或子列表子类。
为了更好的速度,一个确切的检查可以进行身份测试, type(a) is list
。 这比使用==
快一点。
也就是说,Python中的规范是完全避免类型检查,而是进行“鸭子打字”。 你可以在列表中调用列表方法,如果它们成功了,那么我们认为它足够像列表一样。
你需要知道它是否是一个列表,或者只是它是可迭代的(例如,如果你可以在for循环中使用它)? 一般来说,“Pythonic方式”只是继续前进并尝试,除此之外,因为很多事情都可以迭代:字符串,列表,集合,deques,自定义类型等等(它只需要一个__iter__
或__getitem__
方法)
如果你真的需要知道它是什么类型,isinstance()通常是要走的路,因为它也会覆盖子类。
就使用type() == something
而言, int
, float
, list
等都是类型: type(1) == int
是True
。
我典型的方法,我可能有一个字符串,一个列表(或元组等)的字符串,或一个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