2012-08-16 69 views
41

在下面的第二种情况下,Python试图寻找一个局部变量。当它没有找到一个,为什么它不能像第一种情况那样在外部范围内看?为什么嵌套函数可以访问来自外部函数的变量,但不允许修改它们

这看起来对于x在局部范围内,那么外部范围:

def f1(): 
    x = 5 
    def f2(): 
     print x 

这给local variable 'x' referenced before assignment错误:

def f1(): 
    x = 5 
    def f2(): 
     x+=1 

我不允许修改函数f2()的签名等等我无法传递并返回x的值。但是,我确实需要一种修改x的方法。有没有一种方法可以明确告诉Python在外部范围内寻找变量名(类似于global关键字)?

Python版本:2.7

+1

python 3为此提供了'nonlocal',但我认为值得问为什么你需要这样做。这比使用'global'更安全,但仍然感觉不对。 – mgilson 2012-08-16 12:52:23

+2

@mgilson有很多很好的理由可以做到这一点, pep-3104中的基本部分。 – thebjorn 2012-08-16 12:58:48

+0

你使用什么版本的python? – soulcheck 2012-08-16 13:00:17

回答

41
def f1(): 
    x = { 'value': 5 } 
    def f2(): 
     x['value'] += 1 

解决方法是使用可变对象并更新该对象的成员。有时,Python中的名称绑定很棘手。

+0

这工作,虽然我最终使用单个元素而不是字典的列表。谢谢! – Dhara 2012-08-17 07:21:39

+5

我认为使用'nonlocal'或'global'更为正确Global# – bgusach 2013-12-03 08:39:51

+2

Global不是一个好主意,因为它会污染全局命名空间。 Nonlocal是一个python 3特性,这个问题指定了python 2.7。 – 2013-12-04 11:08:22

38

在Python 3.x中,这是可能的:

def f1(): 
     x = 5 
     def f2(): 
       nonlocal x 
       x+=1 
     return f2 

的问题,并解决它,为Python 2.x的还有,在this后给出。此外,请阅读PEP 3104以获取有关此主题的更多信息。

+0

我只是看着这个。 'nonlocal'是在这里使用的语句。 – mgilson 2012-08-16 12:50:24

+0

使用全局而非非本地的python 2.x – User 2012-08-16 13:38:52

+3

@ user1320237全球不工作,而不是nonlocal - 这正是我的问题! – Dhara 2012-08-16 18:11:29

相关问题