En Python 3.9+ , se proponen nuevos operadores de combinación ( |) y actualización ( |=) entre diccionarios. Nota: estos no son los mismos que los operadores de conjuntos mencionados anteriormente.
Operaciones dadas entre dos dictados asignados d1y d2:
>>> d1 = d1 | d2 # 1>>> d1 |= d2 # 2
donde d1es equivalente a través de:
una operación de combinación derecha asignada
una operación de fusión derecha (actualización) en el lugar; equivalente ad1.update(d2)
Ejemplo
Aquí aplicamos merge ( |) y update ( |=) a los dictados :
El collections.Counterestá relacionado con una estructura de datos matemática llamada multiset (mset). Básicamente es un diccionario de pares clave-valor (objeto, multiplicidad).
Operaciones dadas entre dos contadores asignados c1y c2:
>>> c1 = c1 | c2 # 1>>> c1 |= c2 # 2
donde c1es equivalente a través de:
una operación sindical asignada
una operación sindical en el lugar
Una unión de conjuntos múltiples contiene las multiplicidades máximas por entrada. Tenga en cuenta que esto no se comporta de la misma manera que entre dos conjuntos o entre dos dictados regulares.
Ejemplo
Aquí aplicamos union ( |) y la unión in situ ( |=) a los contadores :
Esta sección revisa brevemente algunas matemáticas bit a bit. En el caso más simple, la operación OR bit a bit compara dos bits binarios. Siempre regresará 1excepto cuando ambos bits sean 0.
>>>assert1==(1|1)==(1|0)==(0|1)>>>assert0==(0|0)
Extendemos ahora esta idea más allá de los números binarios. Dados dos números enteros cualesquiera (que carecen de componentes fraccionarios), aplicamos el OR bit a bit y obtenemos un resultado integral:
>>> a =10>>> b =16>>> a | b26
¿Cómo? En general, las operaciones bit a bit siguen algunas "reglas":
comparar internamente equivalentes binarios
aplicar la operación
devuelve el resultado como el tipo dado
Apliquemos estas reglas a nuestros enteros regulares anteriores.
Para ser perfectamente claro, agregaría a la demostración que después de hacer la asignación regular (x = x | y) el id (x) ha cambiado porque es un nuevo objeto, mientras que | = mantiene el mismo id porque es el x original que se modifica, de ahí el nombre "inplace".
Florimond
1
Esta debería ser la respuesta principal, es la más exhaustiva.
Nick
En la sección de números, afirma que la segunda declaración realiza operaciones en el lugar. Creo que no es cierto, ya que los ints no son mutables en Python.
Asocia
106
En Python, y muchos otros lenguajes de programación, |es la operación OR bit a bit . |=es |como +=es +, es decir, una combinación de operación y asignación.
Entonces var |= valuees la abreviatura de var = var | value.
Estaba leyendo un código y |=se usó en un contexto establecido, y no fue hasta que me di cuenta y lo descubrí que noté que esta respuesta también estaba aquí
TallChuck
41
Esta es solo una operación OR entre la variable actual y la otra. Siendo T=Truey F=False, vea la salida gráficamente:
Esto da una impresión algo deformada del operador; |es un operador or bit a bit para enteros, no específicamente un operador booleano, y para cualquier otra cosa que no sea bools, en realidad no producirá Trueo generará Falseresultados. booles una subclase de int, y para ser agradable, la sobrecargaron para boolseguir produciendo True/ Falsesalidas, pero en la mayoría de los casos, las operaciones booleanas deben hacerse con or, no |. Los usos normales de |son bit a bit-or, o set-union. Mejores ejemplos de uso sería algo como lo a = 0b1001; a |= 0b0010; print(bin(a))que produce 0b1011.
ShadowRanger
9
Realiza un OR binario bit a bit de los lados izquierdo y derecho de la asignación, luego almacena el resultado en la variable de la izquierda.
esta es la explicación que estaba buscando, todo el mundo hablaba de sets y bools pero nadie mencionó su uso con números.
Ankush Verma
El ejemplo que dio no es 32 |= 10sino más bien 32 | 10. Solo para aclarar esto para futuros lectores :)
sniper71
@ sniper71 cuál es el resultado de 32 | = 10
Future-Jim
2
Para dar un caso de uso (después de pasar tiempo con las otras respuestas):
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
Básicamente anysin el cortocircuito: podría ser útil si necesita procesar cada elemento y registrar al menos un éxito, etc.
En Python, | = (ior) funciona como una operación de unión. como si x = 5 y x | = 5, entonces ambos valores se convertirán primero en valor binario, luego se realizará la operación de unión y obtendremos la respuesta 5.
|
también se usa como operador de unión de conjuntoRespuestas:
|=
realiza una operación + in situ entre pares de objetos. En particular, entre:En la mayoría de los casos, está relacionado con el
|
operador. Vea los ejemplos a continuación.Conjuntos
Por ejemplo, la unión de dos conjuntos asignados
s1
ys2
comparten las siguientes expresiones equivalentes:donde el valor final de
s1
es equivalente por:Ejemplo
Aquí aplicamos OR (
|
) y el OR (|=
) en el lugar a los conjuntos :Diccionarios
En Python 3.9+ , se proponen nuevos operadores de combinación (
|
) y actualización (|=
) entre diccionarios. Nota: estos no son los mismos que los operadores de conjuntos mencionados anteriormente.Operaciones dadas entre dos dictados asignados
d1
yd2
:donde
d1
es equivalente a través de:d1.update(d2)
Ejemplo
Aquí aplicamos merge (
|
) y update (|=
) a los dictados :Contadores
El
collections.Counter
está relacionado con una estructura de datos matemática llamada multiset (mset). Básicamente es un diccionario de pares clave-valor (objeto, multiplicidad).Operaciones dadas entre dos contadores asignados
c1
yc2
:donde
c1
es equivalente a través de:Una unión de conjuntos múltiples contiene las multiplicidades máximas por entrada. Tenga en cuenta que esto no se comporta de la misma manera que entre dos conjuntos o entre dos dictados regulares.
Ejemplo
Aquí aplicamos union (
|
) y la unión in situ (|=
) a los contadores :Números
Por último, puedes hacer matemáticas binarias.
Operaciones dadas entre dos números asignados
n1
yn2
:donde
n1
es equivalente a través de:Ejemplo
Aquí aplicamos OR (
|
) bit a bit y OR (|=
) bit a bit in situ a los números :revisión
Esta sección revisa brevemente algunas matemáticas bit a bit. En el caso más simple, la operación OR bit a bit compara dos bits binarios. Siempre regresará
1
excepto cuando ambos bits sean0
.Extendemos ahora esta idea más allá de los números binarios. Dados dos números enteros cualesquiera (que carecen de componentes fraccionarios), aplicamos el OR bit a bit y obtenemos un resultado integral:
¿Cómo? En general, las operaciones bit a bit siguen algunas "reglas":
Apliquemos estas reglas a nuestros enteros regulares anteriores.
(1) Compare equivalentes binarios, vistos aquí como cadenas (
0b
denota binario):(2) Aplicar una operación OR bit a bit a cada columna (
0
cuando ambos son0
, de lo contrario1
):(3) Devuelve el resultado en el tipo dado, por ejemplo, base 10, decimal:
La comparación binaria interna significa que podemos aplicar este último a números enteros en cualquier base, por ejemplo, hexadecimal y octal:
Ver también
__ior__()
método para iterar iterables en unaMutableSet
clase base abstracta|=
para actualizar un conjunto+ El operador OR bit a bit en el lugar no se puede aplicar a literales; asignar objetos a los nombres.
++ Los métodos especiales devuelven las mismas operaciones que sus operadores correspondientes.
fuente
int
s no son mutables en Python.En Python, y muchos otros lenguajes de programación,
|
es la operación OR bit a bit .|=
es|
como+=
es+
, es decir, una combinación de operación y asignación.Entonces
var |= value
es la abreviatura devar = var | value
.Un caso de uso común es fusionar dos conjuntos:
fuente
Cuando se usa con conjuntos, realiza una operación de unión.
fuente
|=
se usó en un contexto establecido, y no fue hasta que me di cuenta y lo descubrí que noté que esta respuesta también estaba aquíEsta es solo una operación OR entre la variable actual y la otra. Siendo
T=True
yF=False
, vea la salida gráficamente:Por ejemplo:
fuente
|
es un operador or bit a bit para enteros, no específicamente un operador booleano, y para cualquier otra cosa que no seabool
s, en realidad no produciráTrue
o generaráFalse
resultados.bool
es una subclase deint
, y para ser agradable, la sobrecargaron parabool
seguir produciendoTrue
/False
salidas, pero en la mayoría de los casos, las operaciones booleanas deben hacerse conor
, no|
. Los usos normales de|
son bit a bit-or, o set-union. Mejores ejemplos de uso sería algo como loa = 0b1001; a |= 0b0010; print(bin(a))
que produce0b1011
.Realiza un OR binario bit a bit de los lados izquierdo y derecho de la asignación, luego almacena el resultado en la variable de la izquierda.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
fuente
Es bit a bit o. Digamos que tenemos
32 |= 10
, la imagen 32 y 10 es binaria.Ahora porque | es o, haz un bit a bit o en los dos números
es decir, 1 o 0 -> 1, 0 o 0 -> 0. Continúe con esto en la cadena
Ahora cambia el binario a decimal, 10 1010 = 42.
Para | =, pensar en los ejemplos conocidos,
x +=5
. Significa,x = x + 5,
por tanto, si tenemosx |= 5
, significax = x bitwiseor with 5
.fuente
32 |= 10
sino más bien32 | 10
. Solo para aclarar esto para futuros lectores :)Para dar un caso de uso (después de pasar tiempo con las otras respuestas):
Básicamente
any
sin el cortocircuito: podría ser útil si necesita procesar cada elemento y registrar al menos un éxito, etc.Vea también las advertencias en esta respuesta
fuente
En Python, | = (ior) funciona como una operación de unión. como si x = 5 y x | = 5, entonces ambos valores se convertirán primero en valor binario, luego se realizará la operación de unión y obtendremos la respuesta 5.
fuente