Aar*_*all 10
可以理解的是,你找不到太多的参考.我发现很难得到关于此的参考,但它们存在.
将i在iand指就地,所以它的就地运营商&.如果实施,则&=调用__iand__操作员.如果没有实现,它就是一样的x = x & y.
它主要用于更新内置集类型的交集:
>>> a = set('abc')
>>> a &= set('cbe')
>>> a
set(['c', 'b'])
Run Code Online (Sandbox Code Playgroud)
这与:
>>> a = set('abc')
>>> a.__iand__(set('cbe'))
set(['c', 'b'])
Run Code Online (Sandbox Code Playgroud)
它与调用set.intersection_update方法非常相似,并且将用于控制流,就像对任何对象或变量进行就地更新一样(如果对象是不可变的).
不太常用的不可变冻结对象将在内存更新的内存中替换,变量名称将指向内存中的新对象.
>>> a = frozenset('abc')
>>> a &= set('bce')
>>> a
frozenset({'c', 'b'})
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于 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__'
Run Code Online (Sandbox Code Playgroud)
它是(*几乎)相同,以
a = a & set('bce')
Run Code Online (Sandbox Code Playgroud)
*(我说几乎是因为如果你检查字节码,你会发现底层实现对待set和frozensets是相同的,即使frozensets没有__iand__,并设置do,因为每次调用INPLACE_AND,至少对于编译函数.)
与Sets类似,我们可以使用&=更新二进制选项标志的交集,其中值为Trueis 1.下面,我们证明了" 二进制和二进制数字",(类似于路口)1110和1011是1010:
>>> option_flags = int('1110', 2)
>>> option_flags
14
>>> option_flags &= int('1011', 2)
>>> option_flags
10
>>> bin(option_flags)
'0b1010'
Run Code Online (Sandbox Code Playgroud)
由于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
Run Code Online (Sandbox Code Playgroud)
之后我们有了
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a & b
4
>>> a = a & b
>>> a
4
Run Code Online (Sandbox Code Playgroud)
但
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a &= b
>>> a
99
Run Code Online (Sandbox Code Playgroud)
这是一个简写:
a = a & b
Run Code Online (Sandbox Code Playgroud)
&是逐位and(参见链接进一步的说明),如果a和b是任一int或long.
否则,该陈述相当于:
a = a.__iand__(b)
Run Code Online (Sandbox Code Playgroud)
如果__iand__定义为a.
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |