Please help with MemoryError

Antoine Pitrou solipsis at pitrou.net
Fri Feb 12 17:27:32 EST 2010


Le Fri, 12 Feb 2010 17:10:01 -0500, Steve Holden a écrit :
> 
> As has already been pointed out, if Python used call by reference then
> the following code would run without raising an AssertionError:
> 
> def exchange(a, b):
>     a, b = b, a
> 
> x = 1
> y = 2
> exchange(x, y)
> assert (x == 2 and y == 1)
> 
> Since function-local assignment always takes place in the function
> call's local namespace

I don't think this is related to a difference in parameter passing style.

It's just that assignment ("=") means a different thing in Python than in 
non-object languages (or fake-object languages such as C++ or PHP): it 
rebinds instead of mutating in-place. If it mutated, you wouldn't have 
the AssertionError.

If you mutate in-place:

>>> def exchange(a, b):
...     t = a[:]
...     a[:] = b
...     b[:] = t
... 
>>> x, y = [1], [2]
>>> exchange(x, y)
>>> x, y
([2], [1])

Regards

Antoine.




More information about the Python-list mailing list