【问题标题】:Vertical bar in Python bitwise assignment operatorPython按位赋值运算符中的竖线
【发布时间】:2014-01-20 20:42:50
【问题描述】:

有一个代码,在类的方法中有一行:

object.attribute |= variable

我不明白这是什么意思。我在基本 Python 运算符列表中没有找到 (|=)。

【问题讨论】:

    标签: python python-2.7 operators


    【解决方案1】:

    这是一个 bitwise or 分配。相当于

    object.attribute = object.attribute | variable
    

    阅读more here

    【讨论】:

    • 大部分是等效的 - 它可能就地完成,具体取决于对象。
    【解决方案2】:

    在 python 中,| 是调用对象的__or__ 方法的简写,如here in the docs 和此代码示例所示:

    class Object(object):
        def __or__(self, other):
            print("Using __or__")
    

    让我们看看将| 运算符与这个通用对象一起使用时会发生什么。

    In [62]: o = Object()
    
    In [63]: o | o
    using __or__
    

    如您所见,__or__ 方法被调用。 int、'set'、'bool' 都有__or__ 的实现。对于数字和布尔值,它是按位或。对于集合,它是一个联合。因此,根据属性或变量的类型,行为会有所不同。许多位运算符都设置了等效项see more here

    【讨论】:

      【解决方案3】:

      我应该补充一点,“bar-equals”现在(在 2018 年)最流行地用作集合并集运算符,用于将不存在的元素附加到集合中。

      >>> a = {'a', 'b'}
      >>> a
      set(['a', 'b'])
      
      >>> b = {'b', 'c'}
      >>> b
      set(['c', 'b'])
      
      >>> a |= b
      >>> a
      set(['a', 'c', 'b'])
      

      这方面的一个用例,例如在自然语言处理中,是提取几种语言的组合字母表:

      alphabet |= {unigram for unigram in texts['en']}
      alphabet |= {unigram for unigram in texts['de']}
      ...
      

      【讨论】:

        【解决方案4】:

        对于整数,这对应于 Python 的“按位或”方法。所以在下面的例子中,我们取 4 和 1 的按位或得到 5(或二进制 100 | 001 = 101):

        Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
        [GCC 5.4.0 20160609] on linux
        Type "help", "copyright", "credits" or "license" for more information.
            >>> a = 4
            >>> bin(a)
            '0b100'
            >>> a |= 1
            >>> bin(a)
            '0b101'
            >>> a
            5
        

        更一般化(如 Alejandro 所说)是调用对象的 or 方法,可以为类定义如下形式:

        def __or__(self, other):
            # your logic here
            pass
        

        因此,在整数的特定情况下,我们调用 or 方法,该方法解析为 Python 定义的按位或。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-24
          • 1970-01-01
          • 2020-06-13
          • 2018-02-21
          • 2020-08-10
          • 2011-09-18
          • 2022-10-13
          相关资源
          最近更新 更多