| = (Ior) làm gì trong Python?


112

Google sẽ không cho phép tôi tìm kiếm |=vì vậy tôi gặp khó khăn khi tìm tài liệu liên quan. Có ai biết không?


5
Tôi nghĩ rằng nó có liên quan để chỉ ra, như trong câu trả lời của sunny bên dưới, điều đó |cũng được sử dụng làm toán tử liên hiệp thiết lập
TallChuck

10
vào năm 2019, Google sẽ cho phép bạn tìm kiếm` | = `! :-)
rbennell

Câu trả lời:


45

|=thực hiện một thao tác tại chỗ + giữa các cặp đối tượng. Đặc biệt, giữa:

Trong hầu hết các trường hợp, nó liên quan đến | nhà điều hành. Xem ví dụ bên dưới.

Bộ

Ví dụ, sự kết hợp của hai tập hợp được gán s1s2chia sẻ các biểu thức tương đương sau:

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

trong đó giá trị cuối cùng của s1tương đương bằng:

  1. một hoạt động HOẶC được chỉ định
  2. một hoạt động HOẶC tại chỗ
  3. một hoạt động HOẶC tại chỗ thông qua phương thức đặc biệt ++

Thí dụ

Ở đây chúng tôi áp dụng OR ( |) và thay thế OR ( |=) cho các bộ :

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

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

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

Từ điển

Trong Python 3.9+ , các toán tử merge ( |) và update ( |=) mới được đề xuất giữa các từ điển. Lưu ý: những toán tử này không giống với toán tử tập hợp đã đề cập ở trên.

Đưa ra các phép toán giữa hai phần được chỉ định d1d2:

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

d1tương đương ở đâu qua:

  1. một hoạt động hợp nhất được chỉ định
  2. hoạt động hợp nhất-quyền (cập nhật) tại chỗ; tương đương vớid1.update(d2)

Thí dụ

Ở đây chúng tôi áp dụng merge ( |) và update ( |=) cho các dicts :

>>> 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}

Bộ đếm

collections.Countercó liên quan đến một cấu trúc dữ liệu toán học được gọi là multiset (mset). Về cơ bản, nó là một mệnh lệnh của các cặp khóa-giá trị (đối tượng, tính đa dạng).

Đưa ra các hoạt động giữa hai bộ đếm được chỉ định c1c2:

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

c1tương đương ở đâu qua:

  1. một hoạt động công đoàn được giao
  2. một hoạt động công đoàn tại chỗ

Một tổ hợp nhiều tập chứa số nhân tối đa cho mỗi mục nhập. Lưu ý, điều này không hoạt động giống như giữa hai tập hợp hoặc giữa hai quân số thông thường.

Thí dụ

Ở đây chúng tôi áp dụng union ( |) và union tại chỗ ( |=) cho Bộ đếm :

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})

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

Số

Cuối cùng, bạn có thể làm toán nhị phân.

Đưa ra các phép toán giữa hai số được chỉ định n1n2:

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

n1tương đương ở đâu qua:

  1. một phép toán OR bitwise được chỉ định
  2. một phép toán OR theo chiều bit tại chỗ

Thí dụ

Ở đây chúng tôi áp dụng bitwise OR ( |) và bitwise OR ( ) tại chỗ |=cho các số :

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

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

>>> # Inplace Bitwise OR, |=
>>> n1 |= n2
>>> n1
1

Ôn tập

Phần này xem xét ngắn gọn một số phép toán bitwise. Trong trường hợp đơn giản nhất, phép toán OR theo bit so sánh hai bit nhị phân. Nó sẽ luôn trả về 1ngoại trừ khi cả hai bit 0.

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

Bây giờ chúng tôi mở rộng ý tưởng này ra ngoài số nhị phân. Cho hai số tích phân bất kỳ (thiếu các thành phần phân số), chúng tôi áp dụng OR theo bit và nhận được kết quả tích phân:

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

Làm sao? Nói chung, các hoạt động bitwise tuân theo một số "quy tắc":

  1. so sánh nội bộ tương đương nhị phân
  2. áp dụng hoạt động
  3. trả về kết quả là kiểu đã cho

Hãy áp dụng các quy tắc này cho các số nguyên thông thường của chúng tôi ở trên.

(1) So sánh các giá trị tương đương nhị phân, được xem ở đây dưới dạng chuỗi ( 0bbiểu thị nhị phân):

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

(2) Áp dụng thao tác OR bitwise cho mỗi cột ( 0khi cả hai đều là 0khác 1):

01010
10000
-----
11010

(3) Trả về kết quả ở kiểu đã cho, ví dụ: cơ số 10, số thập phân:

>>> int(0b11010)
26

So sánh nhị phân nội bộ có nghĩa là chúng ta có thể áp dụng thứ hai cho các số nguyên trong bất kỳ cơ số nào, ví dụ: hex và octal:

>>> c = 0xa
>>> d = 0o32
>>> c | d
26

Xem thêm

+ Không thể áp dụng toán tử OR theo chiều bit tại chỗ cho các ký tự; gán tên các đối tượng.

++ Các phương thức đặc biệt trả về các hoạt động giống như các toán tử tương ứng của chúng.


2
Để hoàn toàn rõ ràng, tôi sẽ thêm vào minh chứng rằng sau khi thực hiện phép gán thông thường (x = x | y), id (x) đã thay đổi vì nó là một đối tượng mới, trong khi | = giữ nguyên id vì nó là x ban đầu. được sửa đổi, do đó có tên "inplace".
Florimond

1
Đây phải là câu trả lời hàng đầu - nó là câu trả lời đầy đủ nhất.
Nick

Trong phần số, bạn đang tuyên bố rằng câu lệnh thứ hai thực hiện hoạt động tại chỗ. Tôi nghĩ rằng nó không đúng, vì ints không thể thay đổi trong Python.
Asocia

106

Trong Python và nhiều ngôn ngữ lập trình khác, |phép toán OR theo bit . |=|như +=+ , tức là một sự kết hợp hoạt động và asignment.

Vì vậy, var |= valuelà viết tắt củavar = var | value .

Một trường hợp sử dụng phổ biến là hợp nhất hai tập hợp:

>>> a = {1,2}; a |= {3,4}; print(a)
{1, 2, 3, 4}

21
Bạn có thể vui lòng cung cấp một ví dụ?
khoáng chất

Đã đưa ra một trường hợp sử dụng tôi gặp phải bên dưới
scharfmn

53

Khi được sử dụng với các bộ, nó thực hiện hoạt động liên hiệp.


1
Tôi đã đọc một số mã và |=được sử dụng trong bối cảnh bộ, và nó đã không đến khi tôi sai lầm xung quanh và figured it out mà tôi nhận thấy câu trả lời này đã ở đây quá
TallChuck

41

Đây chỉ là một phép toán OR giữa biến hiện tại và biến khác. Đang T=TrueF=False, xem kết quả đầu ra bằng đồ thị:

r    s    r|=s
--------------
T    T    T
T    F    T
F    T    T
F    F    F

Ví dụ:

>>> r=True
>>> r|=False
>>> r
True
>>> r=False
>>> r|=False
>>> r
False
>>> r|=True
>>> r
True

7
Điều này tạo ra một loại ấn tượng cong vênh về người vận hành; |là một toán tử-hoặc bit đối với số nguyên, không cụ thể là toán tử boolean và đối với bất kỳ thứ gì khác ngoài bools, nó sẽ không thực sự tạo ra Truehoặc xuất Falsera. boollà một lớp con của int, và tốt hơn là họ đã nạp chồng nó boolđể tiếp tục sản xuất True/ Falseđầu ra, nhưng trong hầu hết các trường hợp, các hoạt động boolean nên được thực hiện với orchứ không phải |. Việc sử dụng bình thường cho |là bitwise-or, hoặc set-union. Ví dụ tốt hơn về việc sử dụng sẽ là một cái gì đó giống như cái gì a = 0b1001; a |= 0b0010; print(bin(a))đó tạo ra 0b1011.
ShadowRanger


3

Đó là một chút hoặc. Giả sử chúng ta có 32 |= 10, hình 32 và 10 là nhị phân.

32 = 10 0000
10 = 00 1010

Bây giờ vì | là hoặc, làm một chút hoặc trên hai số

tức là 1 hoặc 0 -> 1, 0 hoặc 0 -> 0. Tiếp tục điều này xuống chuỗi

10 0000 | 00 1010 = 10 1010.

Bây giờ thay đổi số nhị phân thành số thập phân, 10 1010 = 42.

Đối với | =, hãy nghĩ đến các ví dụ đã biết x +=5,. Nó có nghĩa là x = x + 5,vì thế nếu chúng ta có x |= 5, nó có nghĩa x = x bitwiseor with 5.


đây là lời giải thích mà tôi đang tìm kiếm, mọi người đều nói về bộ và bools nhưng không ai đề cập đến việc sử dụng nó với các con số.
Ankush Verma

Ví dụ bạn đưa ra không phải là 32 |= 10nhưng đúng hơn 32 | 10. Chỉ cần làm rõ điều này cho độc giả tương lai :)
sniper71

@ sniper71 kết quả của 32 là gì | = 10
Future-Jim

2

Để đưa ra một trường hợp sử dụng (sau khi dành thời gian cho các câu trả lời khác):

def process(item):
   return bool(item) # imagine some sort of complex processing taking place above

def any_success(data): # return True if at least one is successful
    at_least_one = False
    for item in data:
       at_least_one |= process(item)
    return at_least_one

>>> any_success([False, False, False])
False
>>> any_success([True, False, False])
True
>>> any_success([False, True, False])
True

Về cơ bản anykhông có hiện tượng đoản mạch: có thể hữu ích nếu bạn cần xử lý mọi mục và ghi lại ít nhất một thành công, v.v.

Xem thêm những lưu ý trong câu trả lời này


1

Trong Python, | = (ior) hoạt động giống như hoạt động liên hiệp. giống như nếu x = 5 và x | = 5 thì cả hai giá trị đầu tiên sẽ chuyển đổi thành giá trị nhị phân sau đó phép toán liên hợp sẽ thực hiện và chúng ta nhận được câu trả lời là 5.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.