&=
运算符在Python中意味着什么,你能给我一个有效的例子吗?
I am trying to understand the __iand__
operator.
我只是不知道&=
意味着什么,并且已经在线查看但找不到它。感谢。
答案 0 :(得分:9)
与其他一些答案相反,a &= b
是{em>不是 a = a & b
的简写,但我承认它对内置不可变类型(如整数)的行为通常类似。 / p>
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
答案 1 :(得分:8)
可以理解的是,你找不到太多的参考资料。 I find it hard to get references on this too, but they exist.
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
方法非常相似,并且将用于控制流,就像对任何对象或变量进行就地更新一样(如果对象是不可变的)。
不常用的不可变冻结对象将在内存更新的内存中替换,变量名称将指向内存中的新对象。
>>> a = frozenset('abc')
>>> a &= set('bce')
>>> a
frozenset({'c', 'b'})
在这种情况下,因为 frozenset没有实现__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__'
(*几乎)相同到
a = a & set('bce')
*(我说几乎因为如果你检查字节码,你会看到底层实现对集合和frozensets的处理方式相同,即使frozensets没有__iand__
,并设置do,因为每次调用INPLACE_AND
,至少对于已编译的函数。)
与集合类似,我们可以使用&=
更新二进制选项标记的交集,其中True
的值为1
。下面,我们演示二进制数1110
和1011
的“binary 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
重新分配给新计算的值。
答案 2 :(得分:5)
这是一个简写:
a = a & b
如果&
和a
为b
或int
,则 long
为bitwise and
(有关详细说明,请参阅链接)。
否则,该陈述相当于:
a = a.__iand__(b)
如果为__iand__
定义a
。
答案 3 :(得分:2)
与+=
非常相似。这意味着
a = a & b
答案 4 :(得分:1)
简而言之。在后台,它执行按位二进制操作。
例如二进制5中的0101 而二进制数中的3是0011
现在在它们之间进行“与”运算(当两者均为1时,结果为1,否则为0),您将获得二进制0001,表示十进制为1。
x = 5
x &= 3
print(x)
output >>> 1