&=
运算符在 Python 中是按位与赋值的缩写,它将变量和另一个数进行按位与操作,并将结果赋值给变量。
以下是一个示例:
```python x = 5 x &= 3 # 将 x 与 3 进行按位与操作,并将结果赋值给 x print(x) # 输出结果为 1 ```我只是不知道 &=
是什么意思,查了一下网上也没找到。
&=
运算符在 Python 中是按位与赋值的缩写,它将变量和另一个数进行按位与操作,并将结果赋值给变量。
以下是一个示例:
```python x = 5 x &= 3 # 将 x 与 3 进行按位与操作,并将结果赋值给 x print(x) # 输出结果为 1 ```我只是不知道 &=
是什么意思,查了一下网上也没找到。
a &= b
是什么意思?这取决于a
和b
的类型实现,但语义基本上是
a &= b
a
与其"AND"操作更新为b
。该“AND”操作可以是集合交集、二进制AND操作或其他可由程序员实现的操作。__and__
和__iand__
,并提供了各种类型的多个示例,其中下面具有不同语义(set
,其中a
对象被就地突变,并且frozenset
和int
是不可变的,因此变量a
现在指向新对象)。
i
在iand
中表示就地操作,因此它是&
的就地运算符。&=
如果已经实现,则调用__iand__
运算符。如果未实现,则与x = x & y
相同。
>>> a = set('abc')
>>> a &= set('cbe')
>>> a
set(['c', 'b'])
>>> a = set('abc')
>>> a.__iand__(set('cbe'))
set(['c', 'b'])
这与调用set.intersection_update
方法非常相似,可以在控制流中使用,就像对任何对象或变量进行原地更新一样(如果对象是不可变的)。
较少使用的不可变的frozenset对象将在原位更新时在内存中被替换,并且变量名将指向内存中的新对象。
>>> a = frozenset('abc')
>>> a &= set('bce')
>>> a
frozenset({'c', 'b'})
__iand__
方法,因此>>> a = frozenset('abc')
>>> a.__iand__(set('cbe'))
Traceback (most recent call last):
File "<pyshell#160>", line 1, in <module>
a = frozenset('abc'); a.__iand__(set('cbe'))
AttributeError: 'frozenset' object has no attribute '__iand__'
IT技术几乎与其相同。
a = a & set('bce')
类似于集合,我们可以使用&=更新二进制选项标志的交集,其中True的值为1。下面,我们演示二进制数字1110和1011的“二进制AND”(类似于交集)是1010:
>>> option_flags = int('1110', 2)
>>> option_flags
14
>>> option_flags &= int('1011', 2)
>>> option_flags
10
>>> bin(option_flags)
'0b1010'
由于int
对象与frozenset
示例一样不可变,因此这实际上只是将变量option_flags
重新分配给新计算的值。
与其他答案相反,a &= b
不是a = a & b
的简写,尽管我承认对于像整数这样的内置不可变类型,它通常会表现出类似的行为。
a &= b
如果可用的话可以调用特殊方法__iand__
。为了看到区别,让我们定义一个自定义类:
class NewIand(object):
def __init__(self, x):
self.x = x
def __and__(self, other):
return self.x & other.x
def __iand__(self, other):
return 99
之后我们有
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a & b
4
>>> a = a & b
>>> a
4
但是
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a &= b
>>> a
99
这是一个简写形式:
a = a & b
&
是按位与(请参阅链接以获取进一步的解释),如果a
和b
都是int
或long
。
否则,该语句等同于:
a = a.__iand__(b)
a
定义了 __iand__
。a += b
这样的写法是“a = a + b”的简写。更恰当地说,我会说,“就像 C# 中的 &=”。 - Stefano Sanfilippox = 5
x &= 3
print(x)
output >>> 1
这意味着按位与操作。
例如:
x = 5
x &= 3 #which is similar to x = x & 3
print(x)
The binary of 5 is : 0 1 0 1
The binary of 3 is : 0 0 1 1
AND operation : (If both sides are 1/True then result is 1/True)
0 1 0 1 #Binary of 5
0 0 1 1 #Binary of 3
---------------------
0 0 0 1 #Binary of 1
这与+=
非常相似,意思是
a = a & b
& / __and__ |
&= / __iand__ |
|
---|---|---|
副作用(例如,对其中一个参数的改变) | 虚拟可能,但不鼓励 | 高度预期 |
结果 | 新实例 | 相同实例 |
a = 5
b = 3
print(a & b)
print(a.__and__(b))
print(int.__and__(a, b))
a = 5
b = 3
print(a &= b)
print
需要一个表达式作为参数。但是,你可以这样做:print(a.__iand__(b))
int
没有实现__iand__
(可以理解,原始类型是不可变的)。那么,为什么下面的代码能够正常运行并输出1
呢?a &= b
print(a)
class MutableInt:
def __init__(self, value):
self.value = value
def __and__(self, other):
return MutableInt(self.value & other.value)
def __iand__(self, other):
self.value &= other.value
return self
def __str__(self):
return str(self.value)