4

我说的是一般情况。这是一个例子:

c = 1
def a():
    def b():
        print(c)
    b()
    c = 2

a()

此代码将返回以下错误: NameError: free variable 'c' referenced before assignment in enclosing scope. 虽然逻辑假设是输出应该是1. 这个问题的 Pythonic 解决方案是什么?使用globalornonlocal语句(我不喜欢)?也许只是避免这种情况,多个作用域共享具有相同名称的变量?

4

1 回答 1

5


将其作为参数传递

将外部变量作为参数传递时,请避免重用名称,除非该变量不可能将任何其他变量作为参数处理,那么这并不重要,否则如果您d下次传递并且您对c函数内。

其次,在作为变量传递时,即使将名称从更改为(它几乎没有意义),该值 c 也不会在函数内被修改,因为它不被视为全局变量,即使变量是一个对象,它也只会是此函数中的对象,除非您将其传递给类。paramc

c = 1
def a(param):
    def b():
        print(param)
    b()
    param = 2

a(c)

如果您不想将全局选项作为参数传递并且仍想影响c函数之外,则需要坚持使用全局选项。全局选项影响“外部”c 变量,如您所愿。但这并不是真正的最佳实践,如果可能的话,请尽量使用它。

c = 1
def a():
    global c
    def b():
        print(c)
    b()
    c = 2

a()

这是我的建议:

c = 1
def a(param):
    def b():
        print(param)
    b()
    param = 2
    return param

c = a(c)

甚至:

c = 1
def b(param):
    print(param)
def a(param):
    b(param)
    param = 2
    return param

c = a(c)
于 2013-05-03T16:19:25.097 回答