为什么 "test" and "test" return "test" , 1 and 1 return 1 而不是 True?
Why does "test" and "test" return "test" , 1 and 1 return 1 instead of True?
为什么 "test" and "test" return "test" or 1 and 1 return 1 而不是 True?
>>> 'test' and True
True
>>> True and 1
1
>>> 0 and True
0
>>> 0 and False
0
>>> 'test' and True
True
>>> 'test' and False
False
>>> 0 and True
0
>>> 0 and False
0
>>> 1 and True
True
>>> 1 and False
False
>>> [2,3] and True
True
>>> [2,3] and False
False
为什么它 return 既不是真也不是假?
The expression x and y
first evaluates x
; if x
is false, its value is returned; otherwise, y
is evaluated and the resulting value is returned.
The expression x or y
first evaluates x
; if x
is true, its value is returned; otherwise, y
is evaluated and the resulting value is returned.
(Note that neither and
nor or
restrict the value and type they return to False
and True
, but rather return the last evaluated argument. This is sometimes useful, e.g., if s
is a string that should be replaced by a default value if it is empty, the expression s or 'foo'
yields the desired value. Because not
has to invent a value anyway, it does not bother to return a value of the same type as its argument, so e.g., not 'foo'
yields False, not ''
.)
如文档中所述,如果第一个表达式在 x and y
中为 Falsy,无论表达式 y
的值是多少,它都会被返回,类似地,如果表达式 [=12] =] 为真则返回表达式 x
的结果。
这就是 "test" and "test"
给你 test
的原因。试试这个,
>>> "test1" and "test2"
'test2'
>>> "" and "test2"
''
>>> "" or "test2"
'test2'
>>> "test1" or "test2"
'test1'
在"test1" and "test2"
的情况下,test1
被评估,结果是 Truthy。因此,第二个表达式也必须被评估,评估结果返回为 test2
.
在 "" and "test2"
的情况下,由于空字符串是假的,and
不需要检查第二个表达式。
在"" or "test2"
中,由于空字符串是假的,or
计算下一个表达式,returns作为结果。因此,test2
.
在"test1" and "test2"
中,因为test1
是Truthy,or
不需要计算第二个表达式和returns test1
.
According to the documentation:
x or y if x is False, then y, else x (1)
x and y if x is False, then x, else y (2)
not x if x is False, then True, else False (3)
所以它 returns 要么 x
要么 y
而不是 True
或 False
(not
除外)。
a or b
和 a and b
的计算方式分别类似于 a if a else b
和 b if a else a
。
乍一看这似乎很奇怪,但如果结果被解释为布尔值,它的语义与您对 and
和 or
的预期是一致的。如果你需要结果是一个布尔值,你可以做b = bool(x or y)
。当您在条件(if
、while
等)中使用 or
或 and
时,则不需要。
而且,它非常好用。例如,您可以使用 or
运算符来提供默认值。例如,x = y or "default"
会将 y
的值赋给 x
,如果 y
是 None
(或任何其他值评估为 False
作为布尔值,如空列表、空字符串等)
至于问题,为什么是这样的:我想你得问Python的设计者了。
规则是它 returns 它检查真实性的最后一个值。 and
和 or
的短路行为意味着该值将始终与整个表达式具有相同的真实性。它没有被强制为 bool 的原因主要是因为它不需要 - 而且当前的行为偶尔有用。例如,您可以像这样计算任意数字的数字和:
def digitsum(num):
return num % 9 or 9
相当于,但可以说比:
更优雅
def digitsum(num):
mod = num % 9
return mod if mod else 9
在 python 增长条件表达式之前,偶尔会使用一个更复杂的版本作为三元运算符。
一个 and
链 returns 等于 False 的第一个值或最后一个值,如果它们中的 none 等于 False:
a and b and c ... and z
returns:
a
如果 == 假
b
如果 a == True 且 b == False
c
如果 a == True 且 b == True 且 c == False
...
z
如果所有先前的值都是 True
为什么 "test" and "test" return "test" or 1 and 1 return 1 而不是 True?
>>> 'test' and True
True
>>> True and 1
1
>>> 0 and True
0
>>> 0 and False
0
>>> 'test' and True
True
>>> 'test' and False
False
>>> 0 and True
0
>>> 0 and False
0
>>> 1 and True
True
>>> 1 and False
False
>>> [2,3] and True
True
>>> [2,3] and False
False
为什么它 return 既不是真也不是假?
The expression
x and y
first evaluatesx
; ifx
is false, its value is returned; otherwise,y
is evaluated and the resulting value is returned.The expression
x or y
first evaluatesx
; ifx
is true, its value is returned; otherwise,y
is evaluated and the resulting value is returned.(Note that neither
and
noror
restrict the value and type they return toFalse
andTrue
, but rather return the last evaluated argument. This is sometimes useful, e.g., ifs
is a string that should be replaced by a default value if it is empty, the expressions or 'foo'
yields the desired value. Becausenot
has to invent a value anyway, it does not bother to return a value of the same type as its argument, so e.g.,not 'foo'
yields False, not''
.)
如文档中所述,如果第一个表达式在 x and y
中为 Falsy,无论表达式 y
的值是多少,它都会被返回,类似地,如果表达式 [=12] =] 为真则返回表达式 x
的结果。
这就是 "test" and "test"
给你 test
的原因。试试这个,
>>> "test1" and "test2"
'test2'
>>> "" and "test2"
''
>>> "" or "test2"
'test2'
>>> "test1" or "test2"
'test1'
在"test1" and "test2"
的情况下,test1
被评估,结果是 Truthy。因此,第二个表达式也必须被评估,评估结果返回为 test2
.
在 "" and "test2"
的情况下,由于空字符串是假的,and
不需要检查第二个表达式。
在"" or "test2"
中,由于空字符串是假的,or
计算下一个表达式,returns作为结果。因此,test2
.
在"test1" and "test2"
中,因为test1
是Truthy,or
不需要计算第二个表达式和returns test1
.
According to the documentation:
x or y if x is False, then y, else x (1)
x and y if x is False, then x, else y (2)
not x if x is False, then True, else False (3)
所以它 returns 要么 x
要么 y
而不是 True
或 False
(not
除外)。
a or b
和 a and b
的计算方式分别类似于 a if a else b
和 b if a else a
。
乍一看这似乎很奇怪,但如果结果被解释为布尔值,它的语义与您对 and
和 or
的预期是一致的。如果你需要结果是一个布尔值,你可以做b = bool(x or y)
。当您在条件(if
、while
等)中使用 or
或 and
时,则不需要。
而且,它非常好用。例如,您可以使用 or
运算符来提供默认值。例如,x = y or "default"
会将 y
的值赋给 x
,如果 y
是 None
(或任何其他值评估为 False
作为布尔值,如空列表、空字符串等)
至于问题,为什么是这样的:我想你得问Python的设计者了。
规则是它 returns 它检查真实性的最后一个值。 and
和 or
的短路行为意味着该值将始终与整个表达式具有相同的真实性。它没有被强制为 bool 的原因主要是因为它不需要 - 而且当前的行为偶尔有用。例如,您可以像这样计算任意数字的数字和:
def digitsum(num):
return num % 9 or 9
相当于,但可以说比:
更优雅 def digitsum(num):
mod = num % 9
return mod if mod else 9
在 python 增长条件表达式之前,偶尔会使用一个更复杂的版本作为三元运算符。
一个 and
链 returns 等于 False 的第一个值或最后一个值,如果它们中的 none 等于 False:
a and b and c ... and z
returns:
a
如果 == 假
b
如果 a == True 且 b == False
c
如果 a == True 且 b == True 且 c == False
...
z
如果所有先前的值都是 True