[Edu-sig] How does Python do Pointers?

Michael H. Goldwasser goldwamh at slu.edu
Tue May 6 04:47:09 CEST 2008


This is a great discussion.   While on the topic, I'd like to share a
few more thoughts.

* The original discussion in comparing Python's model to close analogs
  from C was specifically in the context of Dave's original posting.
  I wholeheartedly agree with John/Kirby in that there is no reason to
  dig that deep with new (e.g., untainted) programmers.

* For newbies, the sticky note analogy is wonderful.  I carry around a
  pad of yellow post-it notes for the entire semester so that I can
  literally stick them to the objects on the classroom board.  It
  allows us to instill a distinction between names and underlying
  objects and to portray the assignment semantics.

* The analogy also carries over to portray the repeated assignment of
  a for loop variable to the container's elements.  If you don't mind,
  take a quick peek at the figures on pages 127-132 in Ch. 4 of our book
  (http://esminfo.prenhall.com/computing/goldwasser/Goldwasser_ch04.pdf).
  You'll notice the portrayal of the names "guests" and  "person" in
  the context of a "for person in guests:" loop.

* As an aside, when picking the style for those images, we
  intentionally emphasize that the type-awareness is encapsulated
  within the state of each object (as opposed to with the label).

* The analogy of sticky notes also cleanly portrays the parameter
  passing model.  As John and I mentioned in earlier posts, it is
  precisely the same semantics as assignment.  The formal parameter is
  assigned to the same object identified by the actual parameter.

  In the classroom we take this a step further and start using a
  second color post-it note to start laying the framework for the
  concept of namespaces.   If we had been using yellow notes for the
  names in the caller's context, we start using green notes for names
  in the local namespace of the function.

  The same mechanism is used for the return value.  BTW, as for the
  "pass-by-value", "pass-by-reference" terminology, part of the
  problem is that in the programming language community, those terms
  aren't always used consistently.  In truth, Python is more akin to
  the notion of "pass-by-name" as in Algol (however the pass-by-name
  terminology has not really caught on in general).

* There is one way in which the sticky note analogy breaks down. It
  does not accurately portray the internals of a container that
  references other objects.  For example if you look back at our
  figure on page 127, it gives a false impression that the contents
  of the list are contained "within" the list.  For beginners, this
  analogy suffices.  Also, in this particular case, the elements of
  the list are immutable and so the distinction is less significant.

  But in the long run, it is important for students to understand that
  the list is a list of references (not a list of objects).  The
  sticky note analogy does not work here because because there is no
  name per se to give an individual element (guests[i] is
  syntactically useful, but that is not a true name and the particular
  index is not persistent over time).

  To portray the underlying objects separate from the container's
  state, it becomes necessary to draw a picture more akin to the
  classic "pointer" diagrams.   Yet by this point, it is helpful to do
  so and awareness of the underlying distinction is important.

* As a final note, if students are subsequently introduced to the use
  of dictionaries in their own programming, you can go under the hood
  to give a true explanation of Python's model.  Each namespace is
  implemented as a dictionary and the names are simply strings that
  are keys in the dictionary, mapped to the associated value.  From
  within a function body, locals() command returns access to the
  dictionary representing the local namespace, while globals() returns
  the global namespace.  Further lessons of name resolution can be
  explored as vars(x) gives the instance-level dictionary for an
  object x (other than for built-in primitives which do not rely on
  dictionaries for their internals).  vars(Foo) gives the class-level
  dictionary for a class Foo.


       +-----------------------------------------------
       | Michael Goldwasser
       | Associate Professor
       | Dept. Mathematics and Computer Science
       | Saint Louis University
       | 220 North Grand Blvd.
       | St. Louis, MO 63103-2007



More information about the Edu-sig mailing list