Francis Girard wrote:
Le jeudi 27 Janvier 2005 20:16, Steven Bethard a écrit :

flamesrock wrote:

The statement (1 > None) is false (or any other value above 0). Why is
this?

What code are you executing? I don't get this behavior at all:

py> 100 > None
True
py> 1 > None
True
py> 0 > None
True
py> -1 > None
True
py> -100 > None
True



Wow ! What is it that are compared ? I think it's the references (i.e. the adresses) that are compared. The "None" reference may map to the physical 0x0 adress whereas 100 is internally interpreted as an object for which the reference (i.e. address) exists and therefore greater than 0x0.

Am I interpreting correctly ?

Actually, I believe None is special-cased to work like this. From object.c:

static int
default_3way_compare(PyObject *v, PyObject *w)
{
        ...
        if (v->ob_type == w->ob_type) {
                ...
                Py_uintptr_t vv = (Py_uintptr_t)v;
                Py_uintptr_t ww = (Py_uintptr_t)w;
                return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
        }
        ...
        /* None is smaller than anything */
        if (v == Py_None)
                return -1;
        if (w == Py_None)
                return 1;
        ...
}

So None being smaller than anything (except itself) is hard-coded into Python's compare routine. My suspicion is that even if/when objects of different types are no longer comparable by default (as has been suggested for Python 3.0), None will still compare as smaller than anything...

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to