* Steven D'Aprano:
On Wed, 10 Feb 2010 23:02:27 +0100, Alf P. Steinbach wrote:

For a less likely more technical interpretation, as far as I know in
Python there's just one case of a pointer that does not point to
anything, namely as exemplified by

    def foo():
        print( x )
        x = "whatever"

The Java equivalent would say "NullPointerException", in Python it says
something like "unbound". Which means the same.

Not in plain language. NullPointerException means that x is assigned to a null pointer, and you have tried to follow that pointer. Unbound means that x has nothing assigned to it.

No, it's the same.

   String x;
   somethingIDontRememberProbablyIo.println( x ) // Java equivalent

It's just different terminology, "NullPointerException" versus "unbound".

It's the same semantics.

Nothing substantial is changed by changing the Java message or changing the Python message.

The word is just a word.



Semantically, the difference is somewhat analogous to the situations:

"the president is dead, and a new president hasn't yet been appointed"
(the office of the president is currently assigned to a dead guy)

versus

"the king has dissolved parliament and with it the office of president"
(there is no president at all)

Now, of course we understand that in the implementation of CPython, local variables are stored efficiently in slots in an array, and you can't have empty slots: every address always has some bit pattern. It is very likely that the CPython implementation uses a nil pointer to indicate an empty slot just like Java does. The difference is that Java exposes that implementation decision as part of the language specification, while Python deliberately does not.

How a Python implementation implements local variables is irrelevant, except that since references to local variables can be copied and *live on*, be used, after a call, it has to work as if it uses implementation level pointers.

The notion of pointers (references) at the language level is not the same as the notion of pointers at the implementation level.

This is the same as the notion of integers at the Python 3.x level (unbounded values) is not the same as the notion of integers at the C or C# or Java level (depending on the Python implementation, bounded values with wrap-around or undefined behavior).

I.e. you're conflating two levels here.

You can perhaps more easily see that by considering an implementation of Python in Python, using some computed counter as object id's. It doesn't change the user view of copyable references. But it hides all that C pointer stuff two or three abstraction levels down so that it becomes meaningless to talk about it.


It isn't an accident that the Python exception describes the *semantics* of the error (x is not bound to any value) rather than the implementation detail (the slot known as x has a nil pointer in it). Semantically, the Python language treats the slot as empty and leaves the details of how the implementation recognises empty slots as an implementation decision.

I'm just as interested by the implementation decisions made in CPython as the next guy, but they don't effect the semantics of the high level Python language.

Right.


Here is a thought experiment for you:

One can imagine an implementation of Python that eschews all pointers for some scheme by which objects are cleverly copied and synchronized as needed. Such an implementation would still be Python, but it would be entirely pointer-free.

Uhm, bad example (it wouldn't work exactly as described), but concerning what I think you're trying to /communicate/, that X at the Python level is not the same as X at the implementation level, like, 'int' at the Python 3.x level is not 'int' in C, and like, "pointer" at the Python level is not "pointer" in C: yes.



Cheers & hth.,

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

Reply via email to