在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)
isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/
更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。
在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)
isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/
更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。
当前回答
如果你只需要知道你是否可以对变量使用foo[123]符号,你可以用hasattr(foo, '__getitem__')检查是否存在__getitem__属性(这是python在通过索引访问时调用的属性)。
其他回答
Python使用“鸭子类型”,即如果一个变量像鸭子一样叫,它一定是一只鸭子。在您的情况下,您可能希望它是可迭代的,或者您希望访问某个索引处的项。你应该这样做:即在try块中使用对象for var:或var[idx],如果你得到一个异常,它不是鸭子…
如果你只需要知道你是否可以对变量使用foo[123]符号,你可以用hasattr(foo, '__getitem__')检查是否存在__getitem__属性(这是python在通过索引访问时调用的属性)。
我推荐唯一的python方法:
if isinstance(x, (list, tuple))): pass
原则上,我同意上面Ignacio的观点,但是您也可以使用type来检查某个东西是元组还是列表。
>>> a = (1,)
>>> type(a)
(type 'tuple')
>>> a = [1]
>>> type(a)
(type 'list')
在Python 2.8中,type(list) is list返回false 我建议用这种可怕的方式进行比较:
if type(a) == type([]) :
print "variable a is a list"
(至少在我的系统上,在Mac OS X Yosemite上使用anaconda)