1. ホーム
  2. python

[解決済み] Pythonで|= (ior)は何をするのですか?

2022-03-16 13:27:43

質問

Googleで検索できない |= ので、関連するドキュメントを探すのに苦労しています。どなたかご存知ですか?

解決方法は?

|= が実行されます。 インプレース + オブジェクトのペアの間の操作を行う。 特に、間。

に関連する場合がほとんどです。 | 演算子を使用します。 以下の例を参照してください。

設定

例えば、2つの割り当てられた集合の和は s1s2 は、次のような等価表現を共有します。

>>> s1 = s1 | s2                                           # 1
>>> s1 |= s2                                               # 2
>>> s1.__ior__(s2)                                         # 3

ここで、最終的な s1 のどちらかで等価となる。

  1. 代入されたOR演算
  2. インプレースOR演算
  3. 特殊なメソッドによるインプレース OR 演算 ++

ここでは、ORを適用しています( | ) と、インプレース OR ( |= ) から セット :

>>> s1 = {"a", "b", "c"}
>>> s2 = {"d", "e", "f"}

>>> # OR, | 
>>> s1 | s2
{'a', 'b', 'c', 'd', 'e', 'f'}
>>> s1                                                     # `s1` is unchanged
{'a', 'b', 'c'}

>>> # In-place OR, |=
>>> s1 |= s2
>>> s1                                                     # `s1` is reassigned
{'a', 'b', 'c', 'd', 'e', 'f'}


ディクショナリー

Python 3.9+ は、新しいマージ ( | ) と更新 ( |= という演算子が提案されている。注:これらは上記の集合演算子とは異なる。

割り当てられた2つのディクショナリー間の与えられた操作 d1d2 :

>>> d1 = d1 | d2                                           # 1
>>> d1 |= d2                                               # 2

ここで d1 は、viaと同等です。

  1. 割り当てられたマージライト操作
  2. インプレース・マージ・ライト(更新)操作。 d1.update(d2)

ここでは、マージ( | ) と更新 ( |= ) に変更します。 ディクショナリー :

>>> d1 = {"a": 0, "b": 1, "c": 2}
>>> d2 = {"c": 20, "d": 30}

>>> # Merge, | 
>>> d1 | d2
{"a": 0, "b": 1, "c": 20, "d": 30}
>>> d1 
{"a": 0, "b": 1, "c": 2}

>>> # Update, |=
>>> d1 |= d2
>>> d1 
{"a": 0, "b": 1, "c": 20, "d": 30}


カウンタ

collections.Counter と呼ばれる数学的データ構造に関連しています。 多重集合 (mset)といいます。 基本的には、(オブジェクト、多重度)のキーと値のペアのディクショナリである。

割り当てられた2つのカウンタ間の与えられた操作 c1c2 :

>>> c1 = c1 | c2                                           # 1
>>> c1 |= c2                                               # 2

ここで c1 は、viaと同等です。

  1. 割り当てられたユニオン操作
  2. インプレース・ユニオン操作

A 多重集合の結合 には、各項目の最大倍率が含まれる。 これは、2つのセット間や2つの通常のディクショ ン間と同じようには動作しないことに注意してください。

ここでは、ユニオン( | ) とインプレース・ユニオン ( |= ) から カウンタ :

import collections as ct


>>> c1 = ct.Counter({2: 2, 3: 3})
>>> c2 = ct.Counter({1: 1, 3: 5})

>>> # Union, |    
>>> c1 | c2
Counter({2: 2, 3: 5, 1: 1})
>>> c1
Counter({2: 2, 3: 3})

>>> # In-place Union, |=
>>> c1 |= c2
>>> c1
Counter({2: 2, 3: 5, 1: 1})


数字

最後に、2進数の計算ができることです。

割り当てられた2つの数値の間の演算が与えられる n1n2 :

>>> n1 = n1 | n2                                           # 1
>>> n1 |= n2                                               # 2

ここで n1 は、viaと同等です。

  1. 代入されたビット単位のOR演算
  2. インプレースのビット単位のOR演算

ここでは、ビット単位のORを適用しています( | ) とインプレース・ビットワイズ OR ( |= ) を 数値 :

>>> n1 = 0
>>> n2 = 1

>>> # Bitwise OR, |
>>> n1 | n2
1
>>> n1
0

>>> # In-place Bitwise OR, |=
>>> n1 |= n2
>>> n1
1


レビュー

このセクションでは、ビット単位の計算について簡単に説明します。 最も単純なケースとして、ビット単位のOR演算は2つのバイナリビットを比較します。 これは常に 1 ただし、両方のビットが 0 .

>>> assert 1 == (1 | 1) == (1 | 0) == (0 | 1)
>>> assert 0 == (0 | 0)

この考え方を2進数の枠を超えて発展させたのが 分数成分を含まない)任意の2つの積分数が与えられたとき、ビット単位のORを適用して積分結果を得ます。

>>> a = 10 
>>> b = 16 
>>> a | b
26

どのように? 一般に、ビット演算はいくつかのルールに従っています。

  1. 内部的に2進数の等価物を比較する
  2. 演算を適用する
  3. 指定された型として結果を返す

これらのルールを上記の通常の整数に適用してみましょう。

(1) 2進数の等価物を比較する。ここでは文字列として見ている ( 0b はバイナリを表す)。

>>> bin(a)
'0b1010'
>>> bin(b)
'0b10000'

(2) 各カラムにビット単位の OR 演算を適用する ( 0 が両方ある場合 0 でなければ 1 ):

01010
10000
-----
11010

(3) 結果を指定された型、例えば10進数で返す。

>>> int(0b11010)
26

内部の二項比較は、16進数や8進数など、どの基数の整数にも後者を適用できることを意味する。

>>> a = 10                                   # 10, dec
>>> b = 0b10000                              # 16, bin
>>> c = 0xa                                  # 10, hex
>>> d = 0o20                                 # 16, oct

>>> a | b
26
>>> c | d
26

こちらもご覧ください

+ <サブ インプレース・ビットワイズ OR 演算子はリテラルには適用できませんので、オブジェクトを名前に割り当ててください。

++ <サブ 特殊なメソッドは、対応する演算子と同じ操作を返します。