[Tutor] The trap of the year
bob gailer
bgailer at gmail.com
Tue Jan 25 22:20:59 CET 2011
On 1/25/2011 3:41 PM, Karim wrote:
>
> Hello All,
>
> Just to share on rageous bug I encounter where 2 lists which "should"
> to be different (same id) because hold by different instances of the
> same class are not in fact DIFFERENT, see below:
>
> >>> class Device():
> ... def __init__(self, parameters=[]):
> ... self.parameters = parameters
> ... def param(self):
> ... print(id(self.parameters))
> ...
> >>> a=Device()
> >>> b=Device()
> >>> a.param()
> 140559202956568
> >>> b.param()
> 140559202956568
>
This is not a bug. It is intentional behavior which is documented in the
Python Language Reference.
Under 7.6 Function definitions you will find:
*Default parameter values are evaluated when the function definition is
executed.* This means that the expression is evaluated once, when the
function is defined, and that that same "pre-computed" value is used for
each call. This is especially important to understand when a default
parameter is a mutable object, such as a list or a dictionary: if the
function modifies the object (e.g. by appending an item to a list), the
default value is in effect modified. This is generally not what was
intended. A way around this is to use None as the default, and
explicitly test for it in the body of the function, e.g.:
--
Bob Gailer
919-636-4239
Chapel Hill NC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110125/1680128c/attachment.html>
More information about the Tutor
mailing list