什么是在封闭范围内的赋值错误之前避免引用的Pythonic方法?

时间:2013-05-03 16:15:57

标签: python python-3.x python-2.x

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

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

a()

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

1 个答案:

答案 0 :(得分:5)


将其作为参数传递

当将外部变量作为参数传递时,避免重用名称,除非此变量不可能将任何其他变量作为参数处理,否则它并不重要,否则如果通过d则会引起混淆下次你在函数中对c进行操作。

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

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)