检查变量是不是为列表的最佳方法是啥? [复制]

Posted

技术标签:

【中文标题】检查变量是不是为列表的最佳方法是啥? [复制]【英文标题】:What is the best way to check if a variable is a list? [duplicate]检查变量是否为列表的最佳方法是什么? [复制] 【发布时间】:2017-08-23 17:33:43 【问题描述】:

我找到了这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 等?如果这是可能的,在前两种方法中,我是否必须将列表转换为元组、字符串、字典、int、float 等(不是?),但在第三种方法中?我必须使用 ()、、'',而 int 和 float 还有什么?

【问题讨论】:

我通常更喜欢使用 isinstance 形式而不是类型,它更具表现力并且允许检查不直接从对象继承的对象类的类型 通常必须检查某物的类型是非常糟糕的。只有在绝对必要时才这样做。 【参考方案1】:

您是否需要知道它是否是一个列表,或者它是否是可迭代的(例如,如果您可以在 for 循环中使用它)?通常,“Pythonic 方式”是继续并在 try-except 中执行,因为许多东西都可以迭代:字符串、列表、集合、双端队列、自定义类型等(只需要 __iter____getitem__方法)

如果您真的需要知道它是什么类型,那么 isinstance() 通常是可行的方法,因为它也会涵盖子类。

就使用type() == something而言,intfloatlist等都是类型:type(1) == int就是True

我的典型方法是这样的(对于 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))

【讨论】:

感谢您的建议,但我确实必须进行检查,因为如果我在函数中的参数是一个列表,它将执行类似“for x in list: print(x)”之类的操作,并且如果参数是一个字符串,它只会做: print(argument). 在这种情况下,我会测试它是否是一个字符串。只有两件事是字符串(Py3 中的字节和字符串;Py2 中的字符串和 unicode)。许多东西都是可迭代的(列表、元组、集合、双端队列、自定义对象)。在类似的情况下,我通过测试它是否是字符串来做到这一点,如果不是,它会在 try 中进入 for 循环,然后 except 块检查我是否可以在其上调用 str() (即,如果它有一个 str). 用你的建议改进我的代码我意识到我不只使用字符串:),我也使用整数和浮点数。我怎么做:如果 x 是可迭代的(我的意思是列表、元组等):做某事,elif x 是不可迭代的(我的意思是字符串、整数、浮点数等):做其他事情? 我仍然可能会做同样的事情。首先,您必须使用特殊情况的字符串(因为字符串是可迭代的,但您不想这样做)。然后你通过在 try 中使用 for 循环来检查它是否是可迭代的。在 except 中使用 str(variable) 的第三步将处理整数、浮点数等。我将编辑我的答案以提供示例。【参考方案2】:

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

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

也就是说,Python 中的规范是完全避免类型检查,而是使用"duck typing"。您在 a 上调用列表方法,如果它们成功,那么我们认为 a 足以像列表一样。

【讨论】:

感谢我帖子中的语法修正,抱歉,英语不是我的强项。【参考方案3】:

这些都表达了不同的东西,所以这真的取决于你想要达到的目标:

isinstance(x, list) 检查 x 的类型是 list 还是有 list 作为父类(为了简单起见,我们忽略 ABC 等); type(x) is list 检查x 的类型是否正好是listtype(x) == list 检查类型的相等性,这与相同的类型不同,因为元类可以覆盖 __eq__

因此,它们按顺序表达以下内容:

isinstance(x, list): 是 x 就像 list type(x) is list: 是 x 恰好是 list 并且不是子类 type(x) == list: 是x 一个列表,或者是使用元类魔法伪装成list 的其他类型。

【讨论】:

对不起,我是个菜鸟,我只能理解第二个:“type(x) is list”。 “检查 x 的类型是列表还是列表作为父类¿父类?¿是关于类的东西(我对此几乎一无所知)?。和'检查平等 类型,这与 identical 类型不一样...',对不起,什么是类型平等但类型不同?如果我想要要检查“简单列表”(与类或高级无关),我最好的方法(不太复杂或高级)是使用 "type(x) is a list'?

以上是关于检查变量是不是为列表的最佳方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

检查 Python 变量类型的最佳(惯用)方法是啥? [复制]

检查属性是不是存在的最佳方法是啥? [复制]

android中检查互联网是不是持续活动的最佳方法是啥(当互联网不活动时)? [复制]

在 C# 中检查 double 是不是为整数的好方法是啥? [复制]

存储数据列表并自动分配给结构的最佳方法是啥

检查是不是使用 PyPI 包名称的最佳方法是啥?