在Python中将名称传递给嵌套函数?

2024-04-26 11:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在嵌套函数中使用名称和将名称传递给嵌套函数之间实际上有什么不同(如果有的话)?如果没有区别,按惯例哪一个更好?你知道吗

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

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

Tags: 函数名称helloworldfooputdefbar
2条回答

因为您只讨论嵌套函数,而不是闭包,除非您有特定的理由将其嵌套,否则我建议在模块范围中定义每个函数:

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


def foo(bar):
    put(bar)


foo(['Hello'])

如果出于某种原因确实需要嵌套它,那么最好显式地传入bar。但是,如果您确实认为需要嵌套,请先询问您的推理;很有可能您不需要

不同之处在于,在第一种情况下,bar变量在父函数的作用域中,可以在子函数中使用,除非您对其进行赋值(这种情况类似于在函数中使用global变量)。示例-

>>> 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

在本例中,如果要使用bar并将其赋值,则需要使用^{}关键字,例如-

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

而在第二个函数中,bar是put()函数的局部变量(因为它是函数的一个参数),可以在没有上述UnboundLocalError的情况下赋值,例如-

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

我更喜欢像在第二种情况中那样显式地传递所需的参数。你知道吗

相关问题 更多 >