Nice explanation. Thank you very much.



Thanks,

Arup Rakshit
a...@zeit.io



> On 15-Mar-2019, at 6:24 PM, Calvin Spealman <cspea...@redhat.com> wrote:
> 
> This is actually part of a not entirely uncommon misconception that can arise 
> by comparing objects only by their
> repr() outputs (the string representation created when you pass them to 
> print).
> 
> You're comparing the ID or memory address of the objects and determining they 
> must be the same object. In this case,
> it is a kind of illusion. The function is being garbage collected at the end 
> of each call to sort_by_last_letter() and then, on
> the next call, that address is reused. It is just common for Python to take 
> the next available location, and that happens to
> be the same because you're re-running generally the same code, so the same 
> number of objects are created and destroyed
> each time.
> 
> You can see this by making a slight change: try keeping references to ALL the 
> created functions and you'll see they all
> have different IDs so long as none of them get cleaned up. Try this slightly 
> modified version:
> 
> functions = []
> def sort_by_last_letter(strings):
>     def last_letter(s):
>         return s[-1]
>     print(last_letter)
>     functions.append(last_letter)
>     return sorted(strings, key=last_letter)
> 
> Which produces this output:
> 
> >>> sort_by_last_letter(['ghi', 'def', 'abc'])
> <function sort_by_last_letter.<locals>.last_letter at 0x7f276dd571e0>
> ['abc', 'def', 'ghi']
> >>> sort_by_last_letter(['ghi', 'def', 'abc'])
> <function sort_by_last_letter.<locals>.last_letter at 0x7f276dd57268>
> ['abc', 'def', 'ghi']
> >>> sort_by_last_letter(['ghi', 'def', 'abc'])
> <function sort_by_last_letter.<locals>.last_letter at 0x7f276dd572f0>
> ['abc', 'def', 'ghi']
> 
> On Fri, Mar 15, 2019 at 8:47 AM Arup Rakshit <a...@zeit.io 
> <mailto:a...@zeit.io>> wrote:
> Hi,
> 
> I am reading a book where it says that:
> 
> Just like module-level function definitions, the definition of a local 
> function happens at run time when the def keyword is executed. Interestingly, 
> this means that each call to sort_by_last_letter results in a new definition 
> of the function last_letter. That is, just like any other name bound in a 
> function body, last_letter is bound separately to a new function each time 
> sort_by_last_letter is called. 
> 
> If that above is true, why the below program shows the same object reference 
> for last_letter every time I call function sort_by_last_letter.
> 
> # file name is sample.py
> 
> def sort_by_last_letter(strings):
>     def last_letter(s):
>         return s[-1]
>     print(last_letter)
>     return sorted(strings, key=last_letter)
> 
> python3 -i sample.py 
> >>> sort_by_last_letter(['ghi', 'def', 'abc'])
> <function sort_by_last_letter.<locals>.last_letter at 0x1051e0730>
> ['abc', 'def', 'ghi']
> >>> sort_by_last_letter(['ghi', 'def', 'abc'])
> <function sort_by_last_letter.<locals>.last_letter at 0x1051e0730>
> ['abc', 'def', 'ghi']
> >>> sort_by_last_letter(['ghi', 'def', 'abckl'])
> <function sort_by_last_letter.<locals>.last_letter at 0x1051e0730>
> ['def', 'ghi', 'abckl']
> >>> 
> 
> 
> Thanks,
> 
> Arup Rakshit
> a...@zeit.io <mailto:a...@zeit.io>
> 
> 
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list 
> <https://mail.python.org/mailman/listinfo/python-list>
> 
> 
> -- 
> CALVIN SPEALMAN
> SENIOR QUALITY ENGINEER
> cspea...@redhat.com <mailto:cspea...@redhat.com>  M: +1.336.210.5107 
> <tel:+1.336.210.5107> <https://red.ht/sig>
> TRIED. TESTED. TRUSTED. <https://redhat.com/trusted>
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to