我今天发现您可以在变量分配中使用and
,与使用or
的方式类似。我很少遇到以这种方式使用or
的情况,但是我从未听说有人以这种方式使用and
。这种功能是否太晦涩而无法推荐使用?是否存在一些有助于代码清晰或简洁的具体用例?
a = 1
b = 3
# c is equal to b unless a or b is False; then c is equal to the "False" value. False may be 0, [], False, etc.
c = a and b
print(f'a = {a}, b = {b}, c = {c}')
>>>a = 1, b = 3, c = 3
d = 1
e = 5
# f is equal to d unless d is False; then f is equal to e. Again, "False" may be 0, [], False, etc.
f = d or e
print(f'd = {d}, e = {e}, f = {f}')
>>>d = 1, e = 5, f = 1
似乎存在一个奇怪的不一致之处,显然可以使用运算符来评估条件并为该条件的真实性设置变量(例如g = h > i
或j = k is l
等)。
但是,and
似乎是一个例外。不是评估分配的条件权,而是根据上述注释中描述的规则分配变量。为什么c = a and b
不能仅仅根据True
和False
都具有真实值而求值为a
或b
? (以上示例的计算结果为True
)
谢谢
答案 0 :(得分:6)
用and
进行短路是一种用很少的代码表达意图的便捷方法(确实是一个理想的目标)。
考虑此初始化,以及如果不知道user
为非null时该怎么做。
name = user and user.name
当然,三元将是一个相似的
name = user.name if user else None
但是可读性强吗?
最后,当使用短路and
链接多个吸气剂时,确实开始节省您的理智。
coords = user and user.location and user.location.coords
当您确定覆盖虚假值不会有问题时,请使用or
而不是None
来提供更好的默认值。
name = user and user.name or 'Unnamed'
答案 1 :(得分:1)
基本上,这里所说的是短路评估。当sess1 = tf.Session()
tf.keras.backend.set_session(sess1)
# Train your first Keras model here ...
sess2 = tf.Session()
tf.keras.backend.set_session(sess2)
# Train your second Keras model here ...
中的第一个值评估为and
时,它将返回第二个值,反之则返回True
值。考虑这些陈述
False
答案 2 :(得分:1)
您的问题:为什么c = a和b不能仅仅根据a和b都具有真实值而求值为True或False?
根据Python手册,a and b
的定义为:
if a is false, then a, else b
因此,在您的特定情况下 a
没有副作用时,以上翻译成实际的Python等效于:
c = a if not a else b
但是a
没有副作用通常并不正确。因此,c = a and b
和c = a if not a else b
之间的区别如下:
对于a and b
,如果a
为true,则将永远不会对b
进行评估,而对a
进行一次评估。
使用c = a if not a else b
,就像以前一样,如果a
为true,则将永远不会对b
进行评估,而将对a
进行第二次评估,这可能是a
是否确实有副作用。