Simulating Pointers in Python Simulating Pointers in Python python python

Simulating Pointers in Python


This can be done explicitly.

class ref:    def __init__(self, obj): self.obj = obj    def get(self):    return self.obj    def set(self, obj):      self.obj = obja = ref([1, 2])b = aprint(a.get())  # => [1, 2]print(b.get())  # => [1, 2]b.set(2)print(a.get())  # => 2print(b.get())  # => 2


You may want to read Semantics of Python variable names from a C++ perspective. The bottom line: All variables are references.

More to the point, don't think in terms of variables, but in terms of objects which can be named.


If you're compiling a C-like language, say:

func(){    var a = 1;    var *b = &a;    *b = 2;    assert(a == 2);}

into Python, then all of the "everything in Python is a reference" stuff is a misnomer.

It's true that everything in Python is a reference, but the fact that many core types (ints, strings) are immutable effectively undoes this for many cases. There's no direct way to implement the above in Python.

Now, you can do it indirectly: for any immutable type, wrap it in a mutable type. Ephemient's solution works, but I often just do this:

a = [1]b = ab[0] = 2assert a[0] == 2

(I've done this to work around Python's lack of "nonlocal" in 2.x a few times.)

This implies a lot more overhead: every immutable type (or every type, if you don't try to distinguish) suddenly creates a list (or another container object), so you're increasing the overhead for variables significantly. Individually, it's not a lot, but it'll add up when applied to a whole codebase.

You could reduce this by only wrapping immutable types, but then you'll need to keep track of which variables in the output are wrapped and which aren't, so you can access the value with "a" or "a[0]" appropriately. It'll probably get hairy.

As to whether this is a good idea or not--that depends on why you're doing it. If you just want something to run a VM, I'd tend to say no. If you want to be able to call to your existing language from Python, I'd suggest taking your existing VM and creating Python bindings for it, so you can access and call into it from Python.