为什么具有多个(全部)None 值的元组的计算结果为 True?
Why does a tuple with more than one (all) None value evaulate to True?
为什么一个元组
- 单个 None 元素评估为(正确且预期的)False
- 不止一个(但全部)None 个值计算为 True?
具有一个 None 元素的元组:
>>> metadata = (None)
>>> if metadata:
... print("True")
... else:
... print("False")
...
False
具有一个或多个 None 个元素的元组:
>>> metadata = (None, None)
>>> if metadata:
... print("True")
... else:
... print("False")
...
True
当元组中有多个 None 元素时,我想使用
>>> if all(metadata):
... print("True")
... else:
... print("False")
...
False
得到我想要的结果(也就是说,如果元组中的所有值都是None,我希望它实现它的评估为None)。
当对元组求值时,求值时实际上考虑的是它的长度,而不是它的值的短路吗?这种实施背后的基本原理是什么?
>>> len(metadata)
2
>>>
metadata
在您的第一个代码片段中不是元组:
>>> metadata = (None)
>>> type(metadata)
<class 'NoneType'>
metadata = (None)
等同于 metadata = None
。要使其成为单元素元组,请使用尾随逗号:
metadata = (None,)
现在您可以看到一个元素元组和多个元素元组的工作方式相同。
if metadata:
是空元组的 False
。
metadata = ()
if metadata:
print("True")
else:
print("False")
# False
对于一个包含所有 None
条目的元组 return False
,您可以不使用 if
结构,例如:
>>> not all(x == None for x in metadata)
此 metadata
变量不是元组。它的值是 None
,这就是为什么 if metadata
returns False
.
metadata = (None)
if metadata:
print("True")
else:
print("False")
# False
这个metadata
变量是一个元组。这不是一个空元组。所以if metadata
条件returnsTrue
.
metadata = (None, None)
if metadata:
print("True")
else:
print("False")
# True
如果 metadata
元组不包含空数据或 None
,all(metadata)
将返回 True
。但是在这种情况下 all(metadata)
returns False
.
if all(metadata):
print("True")
else:
print("False")
# False
引用自: https://docs.python.org/3/library/functions.html#all
Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:
def all(iterable):
for element in iterable:
if not element:
return False
return True
所以如果 metadata
是一个空的可迭代对象,all(metadata)
会返回 True
。
为什么一个元组
- 单个 None 元素评估为(正确且预期的)False
- 不止一个(但全部)None 个值计算为 True?
具有一个 None 元素的元组:
>>> metadata = (None)
>>> if metadata:
... print("True")
... else:
... print("False")
...
False
具有一个或多个 None 个元素的元组:
>>> metadata = (None, None)
>>> if metadata:
... print("True")
... else:
... print("False")
...
True
当元组中有多个 None 元素时,我想使用
>>> if all(metadata):
... print("True")
... else:
... print("False")
...
False
得到我想要的结果(也就是说,如果元组中的所有值都是None,我希望它实现它的评估为None)。
当对元组求值时,求值时实际上考虑的是它的长度,而不是它的值的短路吗?这种实施背后的基本原理是什么?
>>> len(metadata)
2
>>>
metadata
在您的第一个代码片段中不是元组:
>>> metadata = (None)
>>> type(metadata)
<class 'NoneType'>
metadata = (None)
等同于 metadata = None
。要使其成为单元素元组,请使用尾随逗号:
metadata = (None,)
现在您可以看到一个元素元组和多个元素元组的工作方式相同。
if metadata:
是空元组的 False
。
metadata = ()
if metadata:
print("True")
else:
print("False")
# False
对于一个包含所有 None
条目的元组 return False
,您可以不使用 if
结构,例如:
>>> not all(x == None for x in metadata)
此 metadata
变量不是元组。它的值是 None
,这就是为什么 if metadata
returns False
.
metadata = (None)
if metadata:
print("True")
else:
print("False")
# False
这个metadata
变量是一个元组。这不是一个空元组。所以if metadata
条件returnsTrue
.
metadata = (None, None)
if metadata:
print("True")
else:
print("False")
# True
如果 metadata
元组不包含空数据或 None
,all(metadata)
将返回 True
。但是在这种情况下 all(metadata)
returns False
.
if all(metadata):
print("True")
else:
print("False")
# False
引用自: https://docs.python.org/3/library/functions.html#all
Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:
def all(iterable): for element in iterable: if not element: return False return True
所以如果 metadata
是一个空的可迭代对象,all(metadata)
会返回 True
。