usar sino relacionales operadores not logicos else ejemplos como bool python comparison operators python-2.x

sino - operadores relacionales en python



¿Por qué 4<''3'' devuelve True en Python 2? (3)

¿Por qué 4 < ''3'' devuelve True en Python 2?

¿Es porque cuando coloco comillas simples alrededor de un número, Python lo ve como una cadena y las cadenas son más grandes que los números?


La operación de comparación predeterminada en cpython 2 se basa en la dirección de memoria del objeto en cuestión. Desde type_richcompare() en python 2.7:

/* Compare addresses */ vv = (Py_uintptr_t)v; ww = (Py_uintptr_t)w; switch (op) { case Py_LT: c = vv < ww; break; case Py_LE: c = vv <= ww; break; case Py_EQ: c = vv == ww; break; case Py_NE: c = vv != ww; break; case Py_GT: c = vv > ww; break; case Py_GE: c = vv >= ww; break; default: result = Py_NotImplemented; goto out; } result = c ? Py_True : Py_False;

Esto funciona realmente bien para la igualdad y la desigualdad, pero puede ser contraintuitivo para las operaciones de ordenación, por lo que se ha cambiado para Python 3. De hecho, 2.7 emitirá una advertencia para tales usos cuando se le dé la -3 .

Para ver la dirección de memoria de un objeto determinado, puede usar la función incorporada id() en él. Solo se define para devolver algo único para cada objeto individual, pero cpython utiliza la dirección de memoria del objeto como un atajo conveniente.

Resulta que los enteros pequeños tienen direcciones de memoria más pequeñas que las cadenas cortas, al menos en ciertas versiones de python, probablemente debido al almacenamiento en caché utilizado por cpython para mejorar el rendimiento.


Sí, cualquier número será menor que cualquier cadena (incluida la cadena vacía) en Python 2.

En Python 3, no puedes hacer comparaciones arbitrarias. Obtendrá un TypeError .

Desde el enlace en el comentario de eryksun :

if (PyNumber_Check(v)) vname = ""; else vname = v->ob_type->tp_name; if (PyNumber_Check(w)) wname = ""; else wname = w->ob_type->tp_name; c = strcmp(vname, wname);

Así que al menos en las versiones recientes de CPython 2.x, los nombres de los tipos se comparan, con una cadena vacía utilizada en lugar del nombre de tipo para cualquier tipo numérico.


De la documentación de Python v2.7.2

Los objetos de diferentes tipos, excepto los números, están ordenados por sus nombres de tipo; los objetos del mismo tipo que no admiten una comparación adecuada están ordenados por su dirección.

Cuando ordena dos cadenas o dos tipos numéricos, la ordenación se realiza de la manera esperada (orden lexicográfico para la cadena, orden numérico para los enteros).

Cuando ordena una cadena y un entero, se ordenan los nombres de los tipos. "str" ​​es lexicográficamente después de "int", "float", "long", "list", "bool", etc. Sin embargo, una tupla ordenará más que una cadena porque "tuple"> "str":

0 > ''hi'' False [1, 2] > ''hi'' False (1, 2) > ''hi'' True

ver también la docs.python.org/tutorial/datastructures.html#id1 de docs.python.org

En Python 3.x, el comportamiento se ha cambiado de modo que al intentar ordenar un número entero y una cadena generará un error:

>>> ''10'' > 5 Traceback (most recent call last): File "", line 1, in ''10'' > 5 TypeError: unorderable types: str() > int()