Puede haber muchos contextos posibles para esta expresión dependiendo de xy y. Podría ser para una verificación de subcadena, pertenencia a una lista, existencia de clave de dictado, por ejemplo.
De hecho, not 'ham' in 'spam and eggs'parece ser un caso especial para realizar una única operación "no en", en lugar de una operación "en" y luego negar el resultado:
>>>import dis
>>>def notin():'ham'notin'spam and eggs'>>> dis.dis(notin)20 LOAD_CONST 1('ham')3 LOAD_CONST 2('spam and eggs')6 COMPARE_OP 7(notin)9 POP_TOP
10 LOAD_CONST 0(None)13 RETURN_VALUE
>>>def not_in():not'ham'in'spam and eggs'>>> dis.dis(not_in)20 LOAD_CONST 1('ham')3 LOAD_CONST 2('spam and eggs')6 COMPARE_OP 7(notin)9 POP_TOP
10 LOAD_CONST 0(None)13 RETURN_VALUE
>>>def not__in():not('ham'in'spam and eggs')>>> dis.dis(not__in)20 LOAD_CONST 1('ham')3 LOAD_CONST 2('spam and eggs')6 COMPARE_OP 7(notin)9 POP_TOP
10 LOAD_CONST 0(None)13 RETURN_VALUE
>>>def noteq():not'ham'=='spam and eggs'>>> dis.dis(noteq)20 LOAD_CONST 1('ham')3 LOAD_CONST 2('spam and eggs')6 COMPARE_OP 2(==)9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0(None)14 RETURN_VALUE
Al principio pensé que siempre daban el mismo resultado, pero que notpor sí solo era simplemente un operador de negación lógica de baja precedencia, que podía aplicarse a in btan fácilmente como cualquier otra expresión booleana, mientras que not inera un operador separado por conveniencia y claridad. .
¡El desmontaje de arriba fue revelador! Parece que, si bien notes obvio que es un operador de negación lógico, el formulario not a in bestá en mayúsculas y minúsculas, por lo que en realidad no utiliza el operador general. Esto hace not a in bliteralmente la misma expresión que a not in b, en lugar de simplemente una expresión que da como resultado el mismo valor.
Tenga en cuenta que esto es solo un detalle de implementación. Ni siquiera puedo encontrar una mención not x in xsen los documentos.
phant0m
1
@ phant0m Absolutamente; la forma en que se supone que debes pensar not x in xses not (x in xs). Pero el hecho de que se implemente analizándolo exactamente en el mismo código de x not in xsbytes muestra claramente que deben ser siempre idénticos, a diferencia de cosas como not x == yvs, x != yque deberían dar el mismo resultado, pero no es necesario (dependiendo de las implementaciones de __eq__e __ne__involucrado).
Ben
11
Te has encontrado con una optimización de mirilla CPython ; una optimización en tiempo de compilación que otras implementaciones de Python como Jython e IronPython pueden ignorar o copiar libremente (no es parte de la especificación del lenguaje).
Martijn Pieters
15
No, no hay diferencia.
El operador not inestá definido para tener el valor verdadero inverso de in.
Otros ya han dejado muy claro que las dos declaraciones son, hasta un nivel bastante bajo, equivalentes.
Sin embargo, no creo que nadie se haya estresado lo suficiente como para que, dado que esto deja la elección
elija el formulario que haga que su código sea lo más legible posible.
Y no necesariamente lo más legible posible para cualquiera , incluso si eso es, por supuesto, algo bueno a lo que aspirar. No, asegúrese de que el código sea lo más legible posible para usted , ya que es más probable que vuelva a este código e intente leerlo.
Si está trabajando en un equipo grande o en un código que probablemente no se modificará durante un tiempo, es más probable que alguien más tenga que mantenerlo.
Tommy Herbert
2
En Python, no hay diferencia. Y no hay preferencia.
Sintácticamente son la misma declaración. Me apresuraría a afirmar que 'ham' not in 'spam and eggs'transmite una intención más clara, pero he visto códigos y escenarios en los que not 'ham' in 'spam and eggs'transmite un significado más claro que el otro.
not x in xs
en los documentos.not x in xs
esnot (x in xs)
. Pero el hecho de que se implemente analizándolo exactamente en el mismo código dex not in xs
bytes muestra claramente que deben ser siempre idénticos, a diferencia de cosas comonot x == y
vs,x != y
que deberían dar el mismo resultado, pero no es necesario (dependiendo de las implementaciones de__eq__
e__ne__
involucrado).not in
se prefiere porque es más obvio y agregaron un caso especial para ello.fuente
Son idénticos en significado, pero el verificador de la guía de estilo Pycodestyle Python (anteriormente llamado pep8) prefiere el
not in
operador en la regla E713 :Consulte también "Python
if x is not None
oif not x is None
?" para una elección de estilo muy similar.fuente
Otros ya han dejado muy claro que las dos declaraciones son, hasta un nivel bastante bajo, equivalentes.
Sin embargo, no creo que nadie se haya estresado lo suficiente como para que, dado que esto deja la elección
elija el formulario que haga que su código sea lo más legible posible.
Y no necesariamente lo más legible posible para cualquiera , incluso si eso es, por supuesto, algo bueno a lo que aspirar. No, asegúrese de que el código sea lo más legible posible para usted , ya que es más probable que vuelva a este código e intente leerlo.
fuente
En Python, no hay diferencia. Y no hay preferencia.
fuente
Sintácticamente son la misma declaración. Me apresuraría a afirmar que
'ham' not in 'spam and eggs'
transmite una intención más clara, pero he visto códigos y escenarios en los quenot 'ham' in 'spam and eggs'
transmite un significado más claro que el otro.fuente