24 comments

[ 0.24 ms ] story [ 94.5 ms ] thread
IINM the reference implementation has a cache for small integers. I wonder what happens if you try the ctypes example in the article with one of the cached integers.
Nothing happens with the cache. According to the article you can't use a Python int, instead you have to use a ctypes.c_int and those are not cached.
I don't think there's a reason why support for pointers can't be added as a package, perhaps one that integrates with ctypes. It could function like PEEK and POKE in the old BASIC interpreters. However, accessing storage as a base plus offset, if desired, could be implemented with numpy arrays.
(comment deleted)
(comment deleted)
Perhaps this is a novice question, but what is an instance where one would need to use pointers in python? I am having trouble thinking of an instance where I would need to do this.
If you want to call a C function that takes a pointer as an argument. For example I've called a Windows API function from python which does that.
Sure, but you only need to because the C function requires you to. I think the person was saying that while coding pure Python, there isn't really anything you would gain by having pointers.
Yeah, for pure python it's not really needed. Python doesn't need a swap function because it has multiple assignment, python doesn't need output parameters because it has multiple return. Pointers would allow a function to take in a string and replace it with a modified version, but simply returning the modified version would generally be clearer and more flexible.

One place where pointers might be useful is if you have some strings spread across a bunch of different objects of different types and you want to do some transformation on all of them. A pointer to each of those strings would mean you could simply modify them instead of having to assign to the containing object. But you can sort of define your own pointer type with a class with one field to solve that problem. The downside of that would be all the objects would have to contain that pointer type instead of the string directly. Another alternative would be getattr/setattr (although that wouldn't work for locals). Or maybe you could rewrite to a visitor pattern.

Overall the slight benefit a pointer would provide is outweighed by the complexity it would bring of people wondering how and when to use it.

Technically python doesn't have multiple return or multiple assignment, it is just automatic tuple packing/unpacking
> A pointer to each of those strings would mean you could simply modify them

You can just use a bytearray if you want a mutable string.

Whiteboarding a doubly linked list at an interview for a job that mentions Python in the requirements... <smirk>
A doubly linked list can be done just fine in python without pointers, because objects use references, and user defined classes are mutable.
I think restype should be set to None in addition to setting argtypes. That way you can avoid the weird number being printed out:

    >>> add_one(ctypes.byref(x))
    998793640
ah yes! this is where i read about string interning. I totally had forgotten the source. Thanks!
Article is mostly fine, but the author does some effort to mention CPython-specific things, but not consistently, making it a bit of a confusing read for when you've worked with different Python implementations at the implementation level (C in my case). E.g. Each object contains at least three pieces of data: Reference count well, in CPython yes but not in implementations which use mark and sweep GC.
Somewhat unrelated to the article, but I'm curious - how commonly and for what purposes are other implementations used for?
MicroPython [0] for instance gets mainly used on microcontrollers. Hard to tell how common it is, but it definitely gained some traction, also runs on the micro:bit [1] which gets used for teaching. Which isn't surprising: Python is easier for beginners than C. i don't know about other implementations though.

[0] https://github.com/micropython/micropython/ [1] https://www.microbit.org/

Aren't all variables in Python already somewhat like a pointer? They're a reference to an object, not a memory address containing a value.
Yes, but pointers are more basic, since Python's internal references participate in garbage collection.

If you would use pointers exclusively, then you'd have to write your own garbage collector. Also, accessing data would be more difficult, and you could not use Python's data types such as classes.

> Fact: Values live until nothing references them.

So if I write

    circular_linked_list = { "next": None }
    circular_linked_list["next"] = { "next": circular_linked_list }
    circular_linked_list = None
My linked list won't get cleaned up? I think the author should be more careful with his wording.