在外部函数中更改变量的值

时间:2014-07-10 17:19:33

标签: python

如何在外部函数中更改变量的值? 实际上,我有以下内容:

def outer():
    variab = ""
    #some code

    def inner():
        # some code
        variab = "new_value"

    print variab

执行后,print语句应该等于“new_value”。如何才能做到这一点? 非常感谢任何建议。

3 个答案:

答案 0 :(得分:3)

首先,在这个简单的情况下,您可以从inner()返回所需的值,并在调用inner()时分配它。但是我们假设这是一个简化的示例,并且您实际上正在更改多个变量,或者将inner返回到将被多次调用的其他地方并且需要重新检查其变量。

在Python 3中,您可以将variab声明为nonlocal,这样您就可以更改它。在Python 2中,唯一的方法是切换到使用每次调用outer时新创建的状态来改变对象。例如,使用列表:

def outer():
    variab = [""]
    #some code including, presumably, a call to inner()

    def inner():
        # some code
        variab[0] = "new_value"

    print variab[0]

可以实现这种更好的变体,例如,使variab包含一个带有可变__dict__的字典或Python实例。一个优雅的习语是使用__dict__函数本身的inner作为容器:

def outer():
    def inner():
        # some code
        inner.variab = "new_value"

    inner.variab = ""
    #some code including, presumably, a call to inner()    
    print inner.variab

答案 1 :(得分:2)

最明智的方法是明确

def outer():
    variab = ""
    #some code

    def inner(variab):
        # some code
        variab = "new_value"
        return variab

    variab = inner(variab)

    print variab

现在您不必担心范围界定,可以单独测试inner等。读者可以清楚inner需要访问variab才能执行此操作它的东西,并且variab在通话后可能会有所不同。

请参阅PEP-0020"显式优于隐式" ;和"可读性计数"

答案 2 :(得分:0)

def outer():
    variab = { 'value': "" }
    def inner():
        variab['value'] = "new_value"

希望这有帮助。