By value or by reference?
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Tue Oct 19 13:06:08 EDT 2004
Donn Cave wrote:
> In article <4173eed0$0$29488$636a15ce at news.free.fr>,
> Bruno Desthuilliers <bdesth.quelquechose at free.quelquepart.fr> wrote:
> ...
>
>>*Short answer :*
>>args are passed by ref, but bindings are local.
>>
>>*Long answer :*
>>You first need to understand what 'variables' in Python are. They are in
>>fact just a symbol referencing an object. Think of a Python 'variable'
>>as an entry in a dict, the name of the variable (the 'symbol') being the
>>key and the reference to the object being the value (AFAIK, this is
>>exactly what they are).
>>
>>You also need to understand the difference between mutable and immutable
>>objects. Strings, numerics and tuples are immutables. Which means that
>>you can not change them. When doing :
>>s = "Hello "
>>s += "World"
>>... you are not modifying the string object bound to s, but creating a
>>new string object and binding it to s.
>
>
> Well, true enough for string, but not true for list for example.
I may not have made clear enough that this consideration only applied to
immutable objects...
>
> Aside from this wretched wart on the language, as another followup
> has already pointed out, you really don't need to distinguish
> mutable vs. immutable to understand argument passing and variable
> binding in Python.
>
> If you write:
> def f(a, b):
> a = 5
> b.flog(5)
>
> ... it makes no difference whether either argument is mutable
> or immutable. a becomes a different object notwithstanding,
> and b.flog operates on the caller's original object whether flog
> modifies anything or not. We tend to make this too complicated.
Perhaps, but still there's the case of
def foo_list(bar_list):
bar_list += ['42']
which behave quite differently from
def foo_str(bar_str):
bar_str += '42'
My 2 cents
Bruno
More information about the Python-list
mailing list