变量分配中“和”的用例

时间:2019-09-05 14:06:04

标签: python python-3.x variable-assignment

我今天发现您可以在变量分配中使用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 > ij = k is l等)。

但是,and似乎是一个例外。不是评估分配的条件权,而是根据上述注释中描述的规则分配变量。为什么c = a and b不能仅仅根据TrueFalse都具有真实值而求值为ab? (以上示例的计算结果为True

谢谢

3 个答案:

答案 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 bc = a if not a else b之间的区别如下:

  1. 对于a and b,如果a为true,则将永远不会对b进行评估,而对a进行一次评估。

  2. 使用c = a if not a else b,就像以前一样,如果a为true,则将永远不会对b进行评估,而将对a进行第二次评估,这可能是a是否确实有副作用。