在局部函数中访问全局函数的变量
Accessing global function's variables in a local function
这是我的测试脚本:
def main(): #global
n = 1
z = None
def addone(): #local
if not z:
n = n+1
addone()
print n
main()
我在 addone()
函数到达调用行后进入该函数。
此时只能看到变量z
,看不到n
.
现在,如果 n
在赋值前被引用, z
不应该也是吗?
同样,如果我把n=n+1
改成z='hi'
,我就再也看不到z
了!
这与我之前对 local/global 函数的所有信念背道而驰!知道的越多,知道的越多,不知道的Python.
问题:
为什么我只能看到一个而不能看到另一个?
我要在要重新分配的这些变量前加上 global
吗?
好吧,经过一些测试,我意识到这一切都与变量的重新分配有关。
例如:
def main(): #global
n = 1
z = None
def addone(): #local
if not z:
x = n+1
addone()
print n
main()
当我在 addone()
函数中时,现在显示 n
和 z
。这是因为我不再尝试重新分配 n
,这对我来说很有意义,以便在局部函数中碰巧使用相似名称时保护全局变量免受操纵。
最好的解决方案是升级到Python 3 并在内部函数nonlocal n
中使用。第二好的,如果你绝对必须坚持 Python 2:
def main(): #global
n = [1]
z = None
def addone(): #local
if not z:
n[0] += 1
addone()
print n[0]
main()
像往常一样,"there is no problem in computer science that cannot be solved with an extra level of indirection"。通过制作 n
列表(并始终使用和分配 n[0]
),从某种意义上说,您正是在介绍救命稻草 "extra level of indirection".
这是我的测试脚本:
def main(): #global
n = 1
z = None
def addone(): #local
if not z:
n = n+1
addone()
print n
main()
我在 addone()
函数到达调用行后进入该函数。
此时只能看到变量z
,看不到n
.
现在,如果 n
在赋值前被引用, z
不应该也是吗?
同样,如果我把n=n+1
改成z='hi'
,我就再也看不到z
了!
这与我之前对 local/global 函数的所有信念背道而驰!知道的越多,知道的越多,不知道的Python.
问题:
为什么我只能看到一个而不能看到另一个?
我要在要重新分配的这些变量前加上
global
吗?
好吧,经过一些测试,我意识到这一切都与变量的重新分配有关。
例如:
def main(): #global
n = 1
z = None
def addone(): #local
if not z:
x = n+1
addone()
print n
main()
当我在 addone()
函数中时,现在显示 n
和 z
。这是因为我不再尝试重新分配 n
,这对我来说很有意义,以便在局部函数中碰巧使用相似名称时保护全局变量免受操纵。
最好的解决方案是升级到Python 3 并在内部函数nonlocal n
中使用。第二好的,如果你绝对必须坚持 Python 2:
def main(): #global
n = [1]
z = None
def addone(): #local
if not z:
n[0] += 1
addone()
print n[0]
main()
像往常一样,"there is no problem in computer science that cannot be solved with an extra level of indirection"。通过制作 n
列表(并始终使用和分配 n[0]
),从某种意义上说,您正是在介绍救命稻草 "extra level of indirection".