SpreadTooThin a écrit :
> Bruno Desthuilliers wrote:
>
>>Nick Vatamaniuc a écrit :
>>(snip)
>>
>>>In Python all the primitives are copied and all other entities are
>>>references.
>>
>>Plain wrong. There's no "primitives" (ie : primitive data types) in
>>Python, only objects. And they all get passed the same way.
>
>
> so..
> def fn(x):
> x = x + 1
> print x
>
> a = 2
> fn(a)
> fn(2)
>
> Wouldn't you say that this is being passed by value rather than by
> refrence?
It's not passed by value. when in fn(), the *local* name 'x' is bound to
(IOW:references) the exact same object you passed to fn(). Then you
rebind this (local) name to *another* object.
def fn((x):
print id(x)
x = x + 1
print id(x)
n = 1256
print id(n)
fn(n)
def fn2(alist):
print id(alist)
alist.append(42)
mylist = []
print id(mylist)
fn2(mylist)
print mylist
print id(mylist)
There's nothing like "pass by value" or "pass by reference" in Python
(and you'll notice I didn't claimed anything about this - just that the
'argument passing scheme' was the same for all objects).
What we call "variables" in Python are name=>object bindings. When
passing a "variable" to a function, the reference to the objet is bound
to the name of the argument in the function's namespace. So the *name*
is local to the function (hence rebinding the name to another objet
doesn't impact the name=>object binding in the caller's namespace), but
this name really refers to the same object (Python doesn't copy anything
unless explicitely told to do so).
HTH
--
http://mail.python.org/mailman/listinfo/python-list