Re: Weird side effect of default parameter
Steven D'Aprano wrote: > Python function default values use *early binding*: the default parameter > is evaluated, ONCE, when the function is defined, and that value is used > each time it is needed. Thanks, "early binding" was the clue I was missing. robert -- https://mail.python.org/mailman/listinfo/python-list
Re: Weird side effect of default parameter
On Thu, 03 May 2018 19:47:37 +, Robert Latest via Python-list wrote: > Hello, > > I don't understand the behavior of the code below. Why does the dict > property "a" of both objects contain the same keys? This is only if > "a=dict" is in the initializer. If I put self.a = dict() into the init > function, I get two separate dicts Python function default values use *early binding*: the default parameter is evaluated, ONCE, when the function is defined, and that value is used each time it is needed. The opposite is *late binding*: the default parameter is not evaluated until it is actually needed, and then re-evaluated each time it is needed. Both approaches have their pros and cons, but early binding is better as the language supported feature, since it is easy to build late binding for yourself: def __init__(self, x, a=None): if a is None: a = dict() self.x = x self.a = a self.a[x] = x whereas if the language used late binding, it would be really difficult to build early binding on top of it. The interaction between early-binding defaults and mutable values like lists and dicts is a well-known "gotcha" (or at least, it is well-known to those of us who have come across it before). It is even a FAQ: https://docs.python.org/dev/faq/programming.html#why-are-default-values- shared-between-objects See also: http://www.effbot.org/zone/default-values.htm -- Steve -- https://mail.python.org/mailman/listinfo/python-list
Re: Weird side effect of default parameter
This is a well known feature of Python. It's a very common "gotcha" to new Python programmers. Google "Mutable default parameters in Python" for long list of explanations and fixes. In short, don't use a mutable object as a default parameter. Gary Herron On 05/03/2018 12:47 PM, python-list@python.org wrote: Hello, I don't understand the behavior of the code below. Why does the dict property "a" of both objects contain the same keys? This is only if "a=dict" is in the initializer. If I put self.a = dict() into the init function, I get two separate dicts class Foo(object): def __init__(self, x, a=dict()): self.x = x self.a = a self.a[x] = x c = Foo(1) d = Foo(2) print(c.__dict__) print(d.__dict__) robert -- Dr. Gary Herron Professor of Computer Science DigiPen Institute of Technology (425) 895-4418 -- https://mail.python.org/mailman/listinfo/python-list
Weird side effect of default parameter
Hello, I don't understand the behavior of the code below. Why does the dict property "a" of both objects contain the same keys? This is only if "a=dict" is in the initializer. If I put self.a = dict() into the init function, I get two separate dicts class Foo(object): def __init__(self, x, a=dict()): self.x = x self.a = a self.a[x] = x c = Foo(1) d = Foo(2) print(c.__dict__) print(d.__dict__) robert -- https://mail.python.org/mailman/listinfo/python-list