V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  gwki  ›  全部回复第 1 页 / 共 1 页
回复总数  1
2018-03-31 13:23:07 +08:00
回复了 miniyao 创建的主题 Python if foobar != None 和 if foobar is not None 是完全等价的吗?
先弄清 value 和 identity
value 可能会变,多个对象可以拥有相同的 value
identity 自对象创建到其被销毁都不会变,每一个对象的 identity 都不同,id(x)可以返回 x 对象的 identity
CPython 将 id(x)实现为返回存储对象的内存地址

is 测试两边运算对象的 id 是否相同,当且仅当对象 x 和 y 的 id(x) == id(y)时 is 返回 True
is not 返回与 is 相反的结果

!=, ==, >, <等叫做值比较,而值比较的默认行为可以通过修改__eq__,__ne__等函数来改变

if 在一个对象的__bool__()不返回 False 和__len__()不返回 0 的情况下认定对象为真,还有,语言内置的常量 None 和 False 被认为是假的

1. if foobar != None 和 if foobar is not None 是完全等价吗?
在下面这种或与其类似的情况下是完全等价的:
class Hello:
def __ne__(self, other):
print("Excalibur !")
return (self is not other)

foobar = Hello()
print(foobar is not None)
print(foobar != None)
一般而言,是不完全等价的
因为 is not 测试 foobar 的 id 和 None 的 id 是否相同,而!=测试 foobar 的值和 None 的值是否相同

2. if foobar is not None 和 if foobar 是完全等价吗?
一般情况下是不等价的,因为前者测试 id 是否相同,后者测试 foobar 的__bool__()或__len__()
当然你也可以修改 foobar 的__bool__函数
以上结论基于 Python3.6 的官方文档^^/
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2628 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
Developed with CodeLauncher
♥ Do have faith in what you're doing.