Bill Allen wrote:
Ok, I have definately verified this to myself.   The following works
perfectly and is a little easier to understand.  In this version, I am
plainly modifying my parts_list iterator thus producing the effect of an
iterator that is growing over the course of the operation of the code.  So,
I am convinced that I had previously assigned part_list to out_list by
reference, not value as I mistaken thought when I first wrote the code,

I believe you're working under a misunderstanding there. Python is neither by reference nor value, if I've understood what you mean by that. (Normally people talk about "by reference" when discussing calling functions, not assignment, so I may have misunderstood you.)

After executing the line `out_list = part_list`, *both* of these statements are *incorrect*:

"out_list is a copy of part_list"  +++ WRONG +++
"out_list and part_list are the same variable (out_list is an alias for part_list)" +++ ALSO WRONG +++

In a nutshell, Python uses the *name binding* assignment model. When you do this:

part_list = [1, 2]

Python creates a *name* "part_list" and binds it to the *object* [1, 2]. Then when you do this:

out_list = part_list

the name "out_list" is created and bound to the same object as part_list. This means that out_list and part_list are two names for the same object, but this is not a permanent state of affairs -- they happen to be bound to the same object now, but you can re-bind one without changing the other.

A month or so ago, somebody raised a similar question about pass by reference and pass by value. If you will excuse me blowing my own trumpet, I think my response then may be useful for you now:

http://www.mail-archive.com/tutor%40python.org/msg46612.html

To use a copy of part_list, you need to explicitly copy it. For lists, the easiest way is with a slice:

out_list = part_list[:]

You can also use the copy module, and functions copy.copy and copy.deepcopy, to copy other objects.


which explains it.  It was a silly mistake born from still being new in
Python and thinking in terms of another language I know that typically
assigns by value instead.  It had no occurred to me initially that it was
possible to modify an iterator in this way.  I do not think most languages
would allow this.

My understanding is that this behaviour -- multiple names for one object -- is standard semantics for most modern languages, including Perl, Ruby, Java, and many others.




--
Steven
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to