在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)

isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/

更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。


当前回答

在Python 2.8中,type(list) is list返回false 我建议用这种可怕的方式进行比较:

if type(a) == type([]) :
  print "variable a is a list"

(至少在我的系统上,在Mac OS X Yosemite上使用anaconda)

其他回答

另一个简单的方法来确定一个变量是列表还是元组,或者检查变量类型:

def islist(obj):
    if ("list" in str(type(obj))):
        return True
    else:
        return False

如果你只需要知道你是否可以对变量使用foo[123]符号,你可以用hasattr(foo, '__getitem__')检查是否存在__getitem__属性(这是python在通过索引访问时调用的属性)。

将参数记录为一个序列,并将其作为一个序列使用。不要检查类型。

你知道的…我这么做可能有点蠢,但我是这么做的

try:
    len(thing)
except:
    # not a list

如果我能知道它的长度,那肯定不止一件事。

编辑:刚刚意识到,如果非列表项是字符串(因为字符串本质上是字符列表),它将不起作用。

那么:hasattr(a, "__iter__")呢?

它告诉返回的对象是否可以作为生成器迭代。默认情况下,元组和列表可以,但字符串类型不行。