【问题标题】:Python a &= b meaning?Python a &= b 是什么意思?
【发布时间】:2014-02-09 20:17:00
【问题描述】:

&= 运算符在 Python 中是什么意思,你能给我一个工作示例吗?

I am trying to understand the __iand__ operator.

我只是不知道&= 是什么意思,上网查了一下,没找到。

【问题讨论】:

    标签: python operators ampersand in-place


    【解决方案1】:

    说明

    可以理解,你找不到太多的参考。 I find it hard to get references on this too, but they exist.

    iand 中的i 表示就地,因此它是& 的就地运算符。 &= 调用 __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'})
    

    在这种情况下,因为 freezeset 没有实现__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')
    

    *(我说几乎是因为如果你检查字节码,你会发现底层实现对集合和冻结集合的处理是一样的,即使冻结集合没有__iand__,并且集合做,因为每个调用INPLACE_AND,至少对于编译函数。)

    内置示例,二进制标志:

    与 Sets 类似,我们可以使用 &amp;= 更新二元选项标志的交集,其中 True 的值为 1。下面,我们证明二进制数11101011的“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】:

      与其他一些答案相反,a &amp;= b 不是 a = a &amp; b 的简写,尽管我承认它对于像整数这样的内置不可变类型的行为通常类似。

      a &amp;= 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
      

      【讨论】:

        【解决方案3】:

        它是以下的简写:

        a = a & b
        

        如果abintlong,则&amp;bitwise and

        否则,语句等价于:

        a = a.__iand__(b)
        

        如果__iand__ 是为a 定义的。

        【讨论】:

        • @JBurnham like a += b 是“a = a + b”的简写。更恰当地说,我会说“像 C# 中的 &=”。
        【解决方案4】:

        它与+= 非常相似。这意味着

        a = a & b
        

        【讨论】:

          【解决方案5】:

          简单来说。在引擎盖下,它执行按位二进制操作。

          例如二进制中的 5 是 0101 而二进制中的3是0011

          现在在它们之间进行“与”运算(当两者均为 1 时结果为 1,否则为 0),您将得到二进制 0001,即十进制中的 1。

          x = 5
          x &= 3
          print(x)
          output >>> 1
          

          【讨论】:

            猜你喜欢
            • 2017-02-02
            • 2013-12-16
            • 2012-06-14
            • 2018-08-06
            • 1970-01-01
            • 2022-11-10
            • 2020-02-09
            • 2010-12-31
            • 2014-01-16
            相关资源
            最近更新 更多