En Tue, 10 Mar 2009 21:23:54 -0200, Craig Allen <callen...@gmail.com> escribió:


I think the point is that function objects compare by object identity,
so the two lambdas you use above are not equal even though they have the
same code.

it raises an interesting question about why doesn't it.  I can think
of practical answers to that, obviously, but in principle, if a
function compiles to exactly the same byte code, you obviously do not
need two copies of it, and like strings shouldn't an identical
function have the same id?

A function is (code + its environment); this includes globals, closures, and its default argument values. So having the same code object doesn't mean it's the same function:

py> def f(x):
...   def g():
...     return x
...   return g
...
py> x1 = f(10)
py> x2 = f(20)
py> x3 = f(30)
py> x1(), x1, x1.func_code
(10,
 <function g at 0x00C2A170>,
 <code object g at 00B93D10, file "<stdin>", line 2>)
py> x2(), x2, x2.func_code
(20,
 <function g at 0x00C233B0>,
 <code object g at 00B93D10, file "<stdin>", line 2>)
py> x3(), x3, x3.func_code
(30,
 <function g at 0x00C1ADB0>,
 <code object g at 00B93D10, file "<stdin>", line 2>)
py> x1.func_code is x2.func_code is x3.func_code
True

Note that the returned "g" function is a different function each time, but g.func_code is always the same code object.

This is merely philosophical, I don't see the value in making this so
(a slight optimizaton and perhaps better conformity to other python
features), but I do think it's an interesting question.

Making == detect "equivalent" functions would slow down all function comparisons (as I posted earlier) and I don't see any advantage...

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to