Python增强赋值布尔运算符

7

Python是否有对应于其布尔运算符的增强赋值语句?

例如,我可以这样写:

x = x + 1

或者这个:
x += 1

有没有一些可以代替这个的写法呢?
x = x and y

为了避免两次写出“x”?
请注意,我知道使用&=语句,但我正在寻找一条语句,可以在y是任何类型时工作,而不仅仅是当y是布尔类型时。

3
简短回答:不行。更长的回答是:布尔运算符永远不会影响操作数,所以原地版本不会给你带来任何东西。您只能绑定到 xy,而不能改变由 x 引用的对象。 - Martijn Pieters
@MartijnPieters,那很有道理,谢谢! - nonagon
2个回答

4
等价的表达式是,对于 and 使用 &=,对于 or 使用 |=
>>> b = True
>>> b &= False
>>> b
False

请注意,按位与按位或只适用于bool类型(正如您期望的那样)。对于其他类型,例如数字类型,按位与逻辑与是不同的。

>>> bool(12) and bool(5)   # logical AND
True

>>> 12 & 5    # bitwise AND
4

请参考这篇文章,更深入地讨论了在这种情况下按位与逻辑操作的区别。

4
不,不完全正确。这仅适用于布尔值。对于其他任何类型的值,它将会出现错误或执行按位与操作。 - Martijn Pieters
+1 即使不完全相同,“...” 对于简单布尔类型肯定有效。 - Joran Beasley
1
@JoranBeasley:答案必须明确说明这一点。现在看起来只是因为布尔类型将两者视为相同,所以某人混淆了位运算符和布尔运算符。 - Martijn Pieters
@Cyber:这样更清晰了,但不是正确的答案。除非OP明确表示只支持布尔值,否则问题的答案是“否”。你的答案是一个不错的技巧,但在考虑到您可以使用任何类型与布尔运算符时,它几乎没有用处。 - Martijn Pieters
确实是这样,很抱歉没有表达清楚。我已经发现了 &=,但我真的想要像 'and' 和 'or' 一样将其操作数作为布尔值进行评估的东西。 - nonagon
显示剩余4条评论

2
不,增强赋值运算符对于布尔运算符是不存在的。
增强赋值运算符存在的目的是为了让可变的左操作数有机会原地修改对象,而不是创建一个新对象。另一方面,布尔运算符不能转换为就地操作;对于x = x and y,你要么将x重新绑定到x,要么将其重新绑定到y,但x本身不会改变。
因此,x and= y实际上会非常令人困惑;要么x保持不变,要么被y替换。
除非您有实际的布尔对象,否则不要使用&=|=增强赋值运算符来进行 按位运算符。只有对于布尔对象(即TrueFalse),这些运算符被重载以产生与andor运算符相同的输出。对于其他类型,它们将导致TypeError,或者应用完全不同的操作。对于整数,这是一种按位操作,对于集合,它会重载为执行交集。

很抱歉打开一个旧话题,但是Martjin关于为什么没有增强版本的布尔运算符的解释并不准确。事实上,Python参考手册指出就地操作行为是可选的,只有在可能的情况下才执行(请参见Augmented assignment statements)。 - davidedb
例如,如果x=1,则赋值x+=3可以运行并重新绑定x4,而不改变原地的数字1 - davidedb
@davidedb:然而,没有布尔增强操作。没有and=or=,因为重新绑定将取决于运算符的结果独立于类型 - Martijn Pieters
@davidedb:对于整数,+= 不会就地更新左侧对象。但对于列表,它确实会这样做。但对于布尔运算符,它有时会这样做,有时不会。因此,那是完全不同的事情。 - Martijn Pieters
@Martijin Pieters:正如我所写的,我是在评论您的陈述:“增强赋值存在的目的是为了让可变的左操作数有机会原地更改对象,而不是创建一个新对象。” 我举了一个增强运算符(+=)的例子,它将其左端对象重新绑定到另一个对象,而不会在原地更改其值。我没有在任何地方写过这是一个普遍规律,并且适用于布尔值。 - davidedb
@davidedb:是的,但我的陈述并不排除这一点。int对象是不可变的;该运算符的存在是为了让可变对象有机会就地修改对象。然而,没有布尔增强运算符与所有这些都没有关系。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接