我正在研究一个关于在多处理时共享数据的更大示例,这时我偶然发现了多处理管理器dict的这种奇怪行为。
from multiprocessing import Manager
mgr = Manager()
d = mgr.dict()
if not d:
print("not d is True")
if not d == None:
print("d == None is false")
输出:
not d is True
d == None is false
我做错什么了吗?如果是,请有人告诉我它是什么。如果不是,这是一个虫子吗?
在Python 2.7和Python 3 中看到
不,这不是不一致,not d
和d == None
测试两种不同的东西。
not d
为布尔上下文中求值为False
的任何d
返回True
。例如,对于以下所有x,not x
为True
:
x = 0
x = []
x = ()
x = ""
x = {}
x = None
您可以通过显式转换为布尔值来询问Python是否将对象求值为True/False:
>>> bool(d)
False
d == None
测试d
是否正是None
单例(因此,习惯于编写d is None
而不是d == None
(。使用一些与上面相同的例子:
>>> {} == None
False
>>> [] == None
False
>>> False == None
False
>>> None == None
True
把它全部煮开,你的两个测试就这样减少了:
if not d
if not bool(d)
if not False
if True
if not d == None
if not (d == None)
if not False
if True
与您的输出相匹配。