为啥空字符串和 None 的评估不同? [复制]

Posted

技术标签:

【中文标题】为啥空字符串和 None 的评估不同? [复制]【英文标题】:Why do empty string and None evaluate differently? [duplicate]为什么空字符串和 None 的评估不同? [复制] 【发布时间】:2014-06-24 01:30:00 【问题描述】:

为什么这两个评价不同?

In [34]: a = ''

In [35]: if a or a >=0:
    print 'y'
    ....:     
y

In [36]: a = None

In [37]: if a or a >=0:
    print 'y'
    ....:     

我认为空字符串的计算结果也为 None(我知道它们不一样)?还是它只是假的,因此评估为 0(如果像 if a: do something 一样测试,则评估为 None)?

【问题讨论】:

我错过了你感到困惑的地方。在第一个例子中?由于>= 0 部分,它打印y 我没想到第一个示例会打印任何内容。 这是因为 string 与 int 比较的工作方式。 if a 部分没有起作用,因为正如您所说,空字符串和 None 不是一回事。 相关:How does Python compare string and int? Even more related。简短的回答是:你为什么要进行这样的比较?它甚至在 python 3 中得到了修复 【参考方案1】:

这是因为在 CPython 中 int 位于 string 之前

来自docs:

CPython 实现细节:除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

所以:

>>> '1' > 1
True

【讨论】:

以上是关于为啥空字符串和 None 的评估不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥一个空数组等于一个空字符串,而不是 javascript 中的另一个空数组? [复制]

为啥 '.sort()' 导致列表在 Python 中为 'None'? [复制]

为啥空的 JavaScript 数组在条件结构中评估为真?

为啥 Enumerable.All 对空序列返回 true? [复制]

用python中re.match匹配为啥一直是None?

为啥 `if None.__eq__("a")` 似乎评估为 True(但不完全)?