Pass name to nested function in Python? -


what (if anything) different between using name in nested function , passing name nested function? if there's no difference, preferred convention?

def foo(bar):     def put():         bar.append('world!')         print(', '.join(bar))     put() foo(['hello']) 

versus

def foo(bar):     def put(bar):         bar += ['world!']         print(', '.join(bar))     put(bar) foo(['hello']) 

the difference in first one, bar variable in scope of parent function, can used in child function , unless assignment on (this case similar using global variables in function) . example -

>>> def foo(bar): ...     def put(): ...         bar = bar + ['world'] ...         print(', '.join(bar)) ...     put() ... >>> >>> foo(['hello']) traceback (most recent call last):   file "<stdin>", line 1, in <module>   file "<stdin>", line 5, in foo   file "<stdin>", line 3, in put unboundlocalerror: local variable 'bar' referenced before assignment 

in case if want use bar , assign well, need use nonlocal keyword , example -

>>> def foo(bar): ...     def put(): ...         nonlocal bar ...         bar = bar + ['world!'] ...         print(', '.join(bar)) ...     put() ... >>> foo(['hello']) hello, world! 

whereas in second one, bar local variable put() function (because argument it) , can assigned without above unboundlocalerror , example -

>>> def foo(bar): ...     def put(bar): ...         bar = bar + ['world!'] ...         print(', '.join(bar)) ...     put(bar) ... >>> >>> foo(['hello']) hello, world! 

i prefer explicitly passing required arguments done in second case.


Comments

Popular posts from this blog

yii2 - Yii 2 Running a Cron in the basic template -

asp.net - 'System.Web.HttpContext' does not contain a definition for 'GetOwinContext' Mystery -

mercurial graft feature, can it copy? -