布尔运算符的python增广赋值

布尔运算符的python增广赋值,python,augmented-assignment,Python,Augmented Assignment,Python是否有与其布尔运算符对应的增广赋值语句 例如,我可以这样写: x = x + 1 或者这个: x += 1 我可以写些什么来代替这个: x = x and y 避免写两次“x” 请注意,我知道有一些语句使用了&=,但我一直在寻找一种在y为任何类型时都能工作的语句,而不仅仅是在y为布尔值时。等价的表达式是&=表示和和表示或 >>> b = True >>> b &= False >>> b False 注意按位和和按

Python是否有与其布尔运算符对应的增广赋值语句

例如,我可以这样写:

x = x + 1
或者这个:

x += 1
我可以写些什么来代替这个:

x = x and y
避免写两次“x”


请注意,我知道有一些语句使用了&=,但我一直在寻找一种在y为任何类型时都能工作的语句,而不仅仅是在y为布尔值时。

等价的表达式是
&=
表示
表示

>>> b = True
>>> b &= False
>>> b
False
注意
按位和
按位或
,并且仅适用于
bool
类型(如您所期望的)<代码>按位AND
与其他类型(如数字)的
逻辑AND
不同

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

>>> 12 & 5    # bitwise AND
4
有关此上下文中按位操作与逻辑操作的更详细的讨论,请参阅。

否,没有

增广赋值的存在是为了给可变的左手操作数机会在适当的位置改变对象,而不是创建新对象。另一方面,布尔运算符不能转换为就地操作;对于
x=x和y
您可以将
x
重新绑定到
x
,或者将其重新绑定到
y
,但
x
本身不会改变

因此,
x和=y
实际上是相当混乱的;
x
将保持不变,或替换为
y


除非您有实际的布尔对象,否则不要为对象使用
&=
|=
增广赋值。仅对于布尔对象(因此
True
False
),那些运算符重载以产生与
运算符相同的输出。对于其他类型,它们要么导致
TypeError
,要么应用完全不同的操作。对于整数,这是一个按位操作,将重载设置为进行交集。

不,不太可能。这仅适用于布尔值。在其他所有情况下,它将是一个错误或按位and.+1,尽管这与
不完全相同。。。它当然适用于简单布尔型types@JoranBeasley:然而,答案必须明确。现在看起来好像有人混淆了按位运算符和布尔运算符,因为布尔类型对待这两个运算符是一样的。@JoranBeasley:此外,OP必须非常明确,他们只使用布尔运算符,这才是可行的答案。@MartijnPieters你是对的,希望我现在能说得更清楚。简短回答:不。不再回答:布尔运算符永远不会影响操作数,所以就地版本不会得到任何结果。您可以绑定到
x
y
,不要更改
x
@MartijnPieters引用的对象,这是有意义的,谢谢!很抱歉打开一个老话题,但是Martjin对为什么不存在布尔运算符的扩充版本的解释并不准确。事实上,Python参考手册指出,就地行为是可选的,只有在可能的情况下才能执行(请参阅)。例如,如果
x=1
,则赋值
x+=3
有效,并将
x
重新绑定到
4
,没有就地修改数字
1
。@davideb:但是没有布尔增广运算。不存在
和=
或=
,因为重新绑定将取决于独立于类型的运算符的结果。@davideb:对于整数,
+=
不会就地更新左侧对象。对于列表,它会这样做。但对于布尔运算符,它有时会这样做,有时不会。这是完全不同的。@Martijin Pieters:正如我所写的,我是在评论你的陈述“增广赋值的存在是为了让可变的左手操作数有机会改变对象的位置,而不是创建一个新的对象。”我展示了一个增广运算符(+=)的示例,它将其左端对象反弹到另一个对象,而不改变其值。我还没有写过任何一篇文章,这是一条普遍的规则,而且对布尔人有效。