[issue20135] FAQ need list mutation answers
Fran Bull added the comment: I read the FAQ last night and I couldn't see these answered there either. I would like to try submitting a patch for this one, probably this evening. It will likely be two FAQs in the programming section that go something like: Why does changing one list change another different list? This happens:
a = [1, 2, 3] b = a b.append(4) print a [1, 2, 3, 4]
because variables are just names for things, in this case 'a' is the list we first defined and then b = a says that 'b' is also a name for that list. They are both the same list. Why are my default args wrong? This happens:
from datetime import datetime class A(object): ... def __init__(self, created_time=datetime.now()): ... self.created_time = created_time ... an_a = A() another_a = A() an_a.created_time datetime.datetime(2014, 1, 16, 10, 40, 54, 33283) another_a.created_time datetime.datetime(2014, 1, 16, 10, 40, 54, 33283)
because default arguments are evaluated when they're read for the first time by the interpreter. Usually when the class is imported. A good way to get the above to do what you want is to use a default argument of None and check for it, like:
class B(object): ... def __init__(self, created_time=None): ... if created_time is None: ... created_time=datetime.now() ... self.created_time = created_time ... a_b = B() another_b = B() a_b.created_time datetime.datetime(2014, 1, 16, 10, 44, 44, 956710) another_b.created_time datetime.datetime(2014, 1, 16, 10, 44, 51, 71311)
Feedback appreciated, particularly I'm not sure if this: 'default arguments are evaluated when they're read for the first time by the interpreter' is exactly the right language. I guess I'll look it up. ---------- nosy: +Fran.Bull _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue20135> _______________________________________
participants (1)
-
Fran Bull