On 01/05/2013 02:27 PM, Chris Angelico wrote:
On Sun, Jan 6, 2013 at 12:06 AM, someone <newsbo...@gmail.com> wrote:
In any case I think we understand each other.
That's one of the links I just posted :) It's not just a naming
difference, though. With Pascal's pass-by-reference semantics, this
code would act differently:
def foo(x):
x = 5
a = 2
foo(a)
print(a)
Python prints 2, because the assignment to x just rebinds the name
inside foo. True pass-by-reference actually changes the caller's
variable. C can achieve this by means of pointers; in Python, you can
I thought that python also used "true" pass-by-reference, although I
haven't figured out exactly when I have this problem. I can just see
that sometimes I get this problem and then I need to copy the variable,
if I don't want the original data of the variable to be overwritten...
pass and mutate a list, thus:
def foo(x):
x[0] = 5 # Dereference the pointer, kinda
x=[None] # Declare a pointer variable, ish
x[0] = 2
foo(x) # Don't forget to drop the [0] when passing the pointer to
another function
print(x[0]) # Prints 5. See? We have pass-by-reference!
Yes, something like this has happened to me in my python code... Not
sure if my example was exactly like this, but I remember something where
I found this to be a problem that I had to fix.
But otherwise, rebinding names in the function has no effect on
anything outside. Among other things, this guarantees that, in any
hmm. ok.... So it's not true pass-by-reference like I thought... That's
interesting.
situation, a name referencing an object can be perfectly substituted
for any other name referencing the same object, or any other way of
accessing the object.
def foo(lst):
lst[0]=len(lst)
x = [10,20,30]
y = x
foo(x) # These two...
foo(y) # ... are identical!
This is something I've experienced from my own coding, I think...
This is a philosophy that extends through the rest of the language. A
function returning a list can be directly dereferenced, as can a list
literal:
def foo():
return [0,1,4,9,16]
print( ["Hello","world!","Testing","Testing","One","Two","Three"][foo()[2]] )
That prints out "One"... I think I understand - that's interesting too...
This is a flexibility and power that just doesn't exist in many older
languages (C and PHP, I'm looking at you). Object semantics make more
sense than any other system for a modern high level language, which is
why many of them do things that way.
I agree, that I think python is really great and it's fast to do
something useful. Not sure I still understand exactly all aspects of
this pass-by-value and by-references, but in any case I know enough to
watch out for this problem and once I see I have a problem, I can also
take care of it and solve it by making a copy. I think maybe after 3-6-9
months more of working with python, I should be fully confident with
this. Thanks for taking the time to explain a bit of this to me...
--
http://mail.python.org/mailman/listinfo/python-list