如何在外部函数中更改变量的值? 实际上,我有以下内容:
def outer():
variab = ""
#some code
def inner():
# some code
variab = "new_value"
print variab
执行后,print语句应该等于“new_value”。如何才能做到这一点? 非常感谢任何建议。
答案 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"
希望这有帮助。