Terminology: "reference" versus "pointer"
Chris Angelico
rosuav at gmail.com
Sun Sep 13 21:03:59 CEST 2015
On Mon, Sep 14, 2015 at 4:04 AM, Akira Li <4kir4.1i at gmail.com> wrote:
>> (If I were drawing a picture rather than ASCII I'd add something to make
>> it clear that the pairs shown are list objects Like, it's a circle with
>> the word "list" and two pointer-boxes inside it.)
>
> "correct and complete" is impossible in the general case for any model.
>
> Imagine what happens if numpy arrays are used instead of Python lists:
>
> lst = [numpy.array([1, 2]) for _ in range(3)]
> a = [lst[0], lst[0]]
> b = [lst[1], lst[2]]
>
> Note: there could be no a[0][0], a[0][1], etc corresponding Python
> objects until you explicitly reference them in the code. If there are no
> Python objects then you can't draw any arrows and therefore "box and
> arrows" model is incomplete.
>
> Or consider this collections of all Unicode characters:
>
> class U:
> def __len__(self):
> return sys.maxunicode + 1
> def __getitem__(self, index):
> if index < 0:
> index += len(self)
> if 0 <= index < len(self):
> return chr(index)
> raise IndexError(index)
>
> u = U()
> print(u[0x61]) # -> a
>
> In this example, it is even more clear that the corresponding items
> might not exist until they are explicitly referenced in a program.
What you've shown there is that it's perfectly possible to have an
abstract collection which generates objects as they're needed. In the
same way, you could define an infinite range object, which effectively
has all positive odd numbers in it:
class Odd:
def __getitem__(self, index):
if index >= 0: return index * 2 + 1
raise IndexError(index)
Obviously it can't have objects representing every positive odd
number, because that's an infinite set. If you want to think of this
as containing all of those integers, sure, but now we're getting into
functional programming styles and ways of representing infinity in
finite RAM, and some things will look a bit different.
However, none of this has anything to do with Python's object model.
The expression "index * 2 + 1" results in the creation of new integer
objects as required, rather than simply retrieving them from some
containment list. The boxes-and-arrows stuff is all about pre-existing
objects; if I construct one list from another, I expect all the
references to be the same, but if I construct two Odd() objects, they
don't have to be:
>>> o1 = Odd(); x1 = o1[12345]
>>> o2 = Odd(); x2 = o2[12345]
>>> x1 is x2
False
Even though every Odd() must, by definition, contain the exact same
integers, it doesn't contain the same objects - it doesn't contain any
objects.
ChrisA
More information about the Python-list
mailing list