On Mon, 23 Jul 2018 09:22:55 +0300, Marko Rauhamaa wrote: > Dennis Lee Bieber <wlfr...@ix.netcom.com>: [...] >> In my world, Java and Python are the ones that are not "common". > > Yes, "boxed" is a Java term. However, the programming pattern of using > dynamic memory and pointers is ubiquitous and ancient:
Not that ancient -- the first version(s) of Fortran didn't have dynamic memory allocation or pointers. (Admittedly, Lisp did follow not long afterwards.) But it is certainly not ubiquitous: many languages don't have pointers at all. > FILE *f = fopen("xyz", "r"); > > where f holds a pointer, fopen() returns a pointer, and "xyz" and "r" > evaluate to pointer values. > > In Python, every expression evaluates to a pointer and every variable > holds a pointer. Within the semantics of the Python language, there are no pointer values, no way to get a pointer to a memory location or a pointer to an object. No expression in Python evaluates to a pointer, no variables hold pointers in Python. The Python language is defined in terms of objects: expressions evaluate to objects, and variables are names bound to objects. If you don't believe me, believe the interpreter: # Marko expects a pointer, but unfortunately he gets an int py> type(1 + 2) <type 'int'> Marko is making a similar category error as those who insist that Python uses "call by reference" or "call by value" for parameter passing. He mistakes an irrelevant implementation detail used by *some* but not all Python interpreters[1] for entities which exist in the Python computation model. As Fredrick puts it: "Joe, I think our son might be lost in the woods" "Don't worry, I have his social security number" http://effbot.org/zone/call-by-object.htm (The *pointer to an object* used in the implementation is not the same as the object itself.) Evaluating 1 + 2 gives the value (an object) 3, not a pointer to the value 3. Pointers are not merely "not first-class citizens" of Python, they aren't citizens at all: there is nothing we can do in pure Python to get hold of pointers, manipulate pointers, or dereference pointers. https://en.wikipedia.org/wiki/First-class_citizen Pointers are merely one convenient, useful mechanism to implement Python's model of computation in an efficient manner on a digital computer. They are not part of the computation model, and pointers are not values available to the Python programmer[2]. [1] The CPython interpreter uses pointers; the Jython interpreter uses whatever kind of memory indirection the JVM provides; when I emulate a Python interpreter using pencil and paper, there's not a pointer in sight but a lot of copying of values and crossing them out. ("Copy on access" perhaps?) A Python interpreter emulated by a Turing machine would use dots on a long paper tape, and an analog computer emulating Python would use I-have-no-idea. Clockwork? Hydraulics? https://en.wikipedia.org/wiki/MONIAC https://makezine.com/2012/01/24/early-russian-hydraulic-computer/ [2] Except by dropping into ctypes or some other interface to the implementation, and even then the pointers have to be converted to and from int objects as they cross the boundary between the Python realm and the implementation realm. -- Steven D'Aprano "Ever since I learned about confirmation bias, I've been seeing it everywhere." -- Jon Ronson -- https://mail.python.org/mailman/listinfo/python-list