On Sat, May 9, 2015 at 11:41 AM, Gregory Ewing <greg.ew...@canterbury.ac.nz> wrote: > Chris Angelico wrote: >> >> How do you know that the function's code >> object was created when compile() happened, rather than being created >> when the function was defined? > > > Python 3.4.2 (default, Feb 4 2015, 20:08:25) > [GCC 4.2.1 (Apple Inc. build 5664)] on darwin > Type "help", "copyright", "credits" or "license" for more information. >>>> source = "def f(x = 42): pass" >>>> code = compile(source, "", "exec") >>>> c1 = code.co_consts[1] >>>> c1 > <code object f at 0x53d430, file "", line 1> >>>> e = {} >>>> exec(code, e) >>>> c2 = e['f'].__code__ >>>> c2 > <code object f at 0x53d430, file "", line 1> >>>> c1 is c2 > True > > Is that proof enough for you?
That's what I reached for as my first try, but it's no different from this: >>> def f(x=42): return x + 1 ... >>> n1 = f() >>> n2 = f(n1-1) >>> n1 is n2 True Clearly in this case, the "x + 1" is getting evaluated at run-time, and yet the interpreter is welcome to intern the constants. So no, it isn't proof - it's equally well explained by the code object being constant. ChrisA -- https://mail.python.org/mailman/listinfo/python-list