No Python 3.9+ , novos operadores merge ( |) e update ( |=) são propostos entre os dicionários. Nota: estes não são iguais aos operadores de conjunto mencionados acima.
Operações dadas entre dois dictos atribuídos d1e d2:
>>> d1 = d1 | d2 # 1>>> d1 |= d2 # 2
onde d1é equivalente via:
uma operação de mesclagem atribuída
uma operação de mesclagem (atualização) no local; equivalente ad1.update(d2)
Exemplo
Aqui aplicamos merge ( |) e update ( |=) aos dicts :
O collections.Counterestá relacionado a uma estrutura de dados matemática chamada multiset (mset). É basicamente um dicionário de pares de valores-chave (objeto, multiplicidade).
Operações dadas entre dois contadores atribuídos c1e c2:
>>> c1 = c1 | c2 # 1>>> c1 |= c2 # 2
onde c1é equivalente via:
uma operação sindical atribuída
uma operação sindical local
Uma união de multisets contém as multiplicidades máximas por entrada. Observe que isso não se comporta da mesma maneira que entre dois conjuntos ou entre dois dictos regulares.
Exemplo
Aqui, aplicamos union ( |) e union ( ) in-loco |=aos contadores :
Esta seção revisa brevemente algumas matemáticas bit a bit. No caso mais simples, a operação bit a bit OR compara dois bits binários. Ele sempre retornará, 1exceto quando ambos os bits forem 0.
>>>assert1==(1|1)==(1|0)==(0|1)>>>assert0==(0|0)
Agora estendemos essa ideia além dos números binários. Dados quaisquer dois números inteiros (sem componentes fracionários), aplicamos o OR bit a bit e obtemos um resultado integral:
>>> a =10>>> b =16>>> a | b
26
Quão? Em geral, as operações bit a bit seguem algumas "regras":
comparar internamente equivalentes binários
aplicar a operação
retorna o resultado como o tipo fornecido
Vamos aplicar essas regras aos nossos números inteiros regulares acima.
(1) Compare os equivalentes binários, vistos aqui como strings ( 0bdenota binário):
>>> bin(a)'0b1010'>>> bin(b)'0b10000'
(2) Aplique uma operação OR bit a bit a cada coluna ( 0quando ambas estiverem 0, senão 1):
0101010000-----11010
(3) Retorne o resultado no tipo fornecido, por exemplo, base 10, decimal:
>>> int(0b11010)26
A comparação binária interna significa que podemos aplicar o último a inteiros em qualquer base, por exemplo, hex e octal:
Para ficar perfeitamente claro, eu acrescentaria à demonstração de que depois de fazer a atribuição regular (x = x | y) o id (x) mudou porque é um novo objeto, enquanto | = mantém o mesmo id porque é o x original que é modificado, daí o nome "local".
Florimond
1
Esta deve ser a resposta principal - é a mais exaustiva.
Nick
Na seção de números, você afirma que a segunda instrução opera no local. Acho que não é verdade, já que ints não são mutáveis em Python.
Asocia
106
Em Python, e em muitas outras linguagens de programação, |é a operação bit a bit OR . |=é |como +=é +, ou seja, uma combinação de operação e atribuição.
Portanto, var |= valueé abreviação de var = var | value.
Eu estava lendo um código e ele |=era usado no contexto definido, e não foi até que eu baguncei e descobri que percebi que essa resposta também estava aqui
TallChuck
41
Esta é apenas uma operação OR entre a variável atual e a outra. Sendo T=Truee F=False, veja a saída graficamente:
r s r|=s
--------------
T T T
T F T
F T T
F F F
Por exemplo:
>>> r=True>>> r|=False>>> r
True>>> r=False>>> r|=False>>> r
False>>> r|=True>>> r
True
Isso dá uma impressão meio distorcida do operador; |é um operador bit a bit para inteiros, não especificamente um operador booleano, e para qualquer coisa diferente de bools, ele não irá realmente produzir Trueou dar Falsesaída. boolé uma subclasse de int, e para ser bom, eles a sobrecarregaram para boolcontinuar produzindo True/ Falsesaídas, mas na maioria dos casos, as operações booleanas deveriam ser feitas com or, não |. Os usos normais de |são bitwise-or ou set-union. Melhores exemplos de uso seriam algo como a = 0b1001; a |= 0b0010; print(bin(a))qual produz 0b1011.
ShadowRanger
9
Ele executa um OR bit a bit binário dos lados esquerdo e direito da atribuição e, a seguir, armazena o resultado na variável à esquerda.
essa é a explicação que eu procurava, todo mundo falava sobre sets e bools mas ninguém mencionava seu uso com números.
Ankush Verma
O exemplo que você deu não é, 32 |= 10mas sim 32 | 10. Apenas para esclarecer isso para futuros leitores :)
atirador 71
@ sniper71 qual é o resultado de 32 | = 10
Futuro-Jim
2
Para fornecer um caso de uso (depois de passar algum tempo com as outras respostas):
def process(item):return bool(item)# imagine some sort of complex processing taking place abovedef any_success(data):# return True if at least one is successful
at_least_one =Falsefor 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
Basicamente, anysem o curto-circuito: pode ser útil se você precisar processar cada item e registrar pelo menos um sucesso, etc.
Em Python, | = (ior) funciona como uma operação de união. como se x = 5 ex | = 5, então ambos os valores serão primeiro convertidos em valor binário, então a operação de união será executada e obteremos a resposta 5.
|
também é usado como o operador de união de conjuntosRespostas:
|=
executa uma operação + no local entre pares de objetos. Em particular, entre:Na maioria dos casos, está relacionado ao
|
operador. Veja os exemplos abaixo.Jogos
Por exemplo, a união de dois conjuntos atribuídos
s1
es2
compartilham as seguintes expressões equivalentes:onde o valor final de
s1
é equivalente por:Exemplo
Aqui, aplicamos OR (
|
) e OR (|=
) local aos conjuntos :Dicionários
No Python 3.9+ , novos operadores merge (
|
) e update (|=
) são propostos entre os dicionários. Nota: estes não são iguais aos operadores de conjunto mencionados acima.Operações dadas entre dois dictos atribuídos
d1
ed2
:onde
d1
é equivalente via:d1.update(d2)
Exemplo
Aqui aplicamos merge (
|
) e update (|=
) aos dicts :Contadores
O
collections.Counter
está relacionado a uma estrutura de dados matemática chamada multiset (mset). É basicamente um dicionário de pares de valores-chave (objeto, multiplicidade).Operações dadas entre dois contadores atribuídos
c1
ec2
:onde
c1
é equivalente via:Uma união de multisets contém as multiplicidades máximas por entrada. Observe que isso não se comporta da mesma maneira que entre dois conjuntos ou entre dois dictos regulares.
Exemplo
Aqui, aplicamos union (
|
) e union ( ) in-loco|=
aos contadores :Números
Por último, você pode fazer matemática binária.
Operações dadas entre dois números atribuídos
n1
en2
:onde
n1
é equivalente via:Exemplo
Aqui, aplicamos OR bit a bit (
|
) e o OR bit a bit no local (|=
) aos números :Reveja
Esta seção revisa brevemente algumas matemáticas bit a bit. No caso mais simples, a operação bit a bit OR compara dois bits binários. Ele sempre retornará,
1
exceto quando ambos os bits forem0
.Agora estendemos essa ideia além dos números binários. Dados quaisquer dois números inteiros (sem componentes fracionários), aplicamos o OR bit a bit e obtemos um resultado integral:
Quão? Em geral, as operações bit a bit seguem algumas "regras":
Vamos aplicar essas regras aos nossos números inteiros regulares acima.
(1) Compare os equivalentes binários, vistos aqui como strings (
0b
denota binário):(2) Aplique uma operação OR bit a bit a cada coluna (
0
quando ambas estiverem0
, senão1
):(3) Retorne o resultado no tipo fornecido, por exemplo, base 10, decimal:
A comparação binária interna significa que podemos aplicar o último a inteiros em qualquer base, por exemplo, hex e octal:
Veja também
__ior__()
método para iterar iteráveis em umaMutableSet
classe base abstrata|=
para atualizar um conjunto+ O operador OR bit a bit no local não pode ser aplicado a literais; atribuir objetos a nomes.
++ Os métodos especiais retornam as mesmas operações que seus operadores correspondentes.
fonte
int
s não são mutáveis em Python.Em Python, e em muitas outras linguagens de programação,
|
é a operação bit a bit OR .|=
é|
como+=
é+
, ou seja, uma combinação de operação e atribuição.Portanto,
var |= value
é abreviação devar = var | value
.Um caso de uso comum é combinar dois conjuntos:
fonte
Quando usado com conjuntos, ele executa a operação de união.
fonte
|=
era usado no contexto definido, e não foi até que eu baguncei e descobri que percebi que essa resposta também estava aquiEsta é apenas uma operação OR entre a variável atual e a outra. Sendo
T=True
eF=False
, veja a saída graficamente:Por exemplo:
fonte
|
é um operador bit a bit para inteiros, não especificamente um operador booleano, e para qualquer coisa diferente debool
s, ele não irá realmente produzirTrue
ou darFalse
saída.bool
é uma subclasse deint
, e para ser bom, eles a sobrecarregaram parabool
continuar produzindoTrue
/False
saídas, mas na maioria dos casos, as operações booleanas deveriam ser feitas comor
, não|
. Os usos normais de|
são bitwise-or ou set-union. Melhores exemplos de uso seriam algo comoa = 0b1001; a |= 0b0010; print(bin(a))
qual produz0b1011
.Ele executa um OR bit a bit binário dos lados esquerdo e direito da atribuição e, a seguir, armazena o resultado na variável à esquerda.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
fonte
É bit a bit ou. Digamos que temos
32 |= 10
, as imagens 32 e 10 são binárias.Agora porque | é ou, faça um bit a bit ou nos dois números
ou seja, 1 ou 0 -> 1, 0 ou 0 -> 0. Continue descendo a cadeia
Agora mude o binário em decimal, 10 1010 = 42.
Para | =, pense nos exemplos conhecidos
x +=5
,. Significa,x = x + 5,
portanto, se tivermosx |= 5
, isso significax = x bitwiseor with 5
.fonte
32 |= 10
mas sim32 | 10
. Apenas para esclarecer isso para futuros leitores :)Para fornecer um caso de uso (depois de passar algum tempo com as outras respostas):
Basicamente,
any
sem o curto-circuito: pode ser útil se você precisar processar cada item e registrar pelo menos um sucesso, etc.Veja também as advertências nesta resposta
fonte
Em Python, | = (ior) funciona como uma operação de união. como se x = 5 ex | = 5, então ambos os valores serão primeiro convertidos em valor binário, então a operação de união será executada e obteremos a resposta 5.
fonte