On Mon, Sep 14, 2015 at 4:04 AM, Akira Li <4kir4...@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 -- https://mail.python.org/mailman/listinfo/python-list