scared about refrences...
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Thu Nov 2 15:54:48 EST 2006
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
More information about the Python-list
mailing list