这是我的测试脚本:
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
!
这与我之前关于本地/全球功能的所有信念相反!你知道的越多,你就越不了解Python。
问题(S):
为什么我能看到一个而不是另一个?
我是否希望将global
添加到我想重新分配的变量中?
答案 0 :(得分:1)
最佳解决方案是升级到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()
像往常一样,"计算机科学中没有任何问题无法用额外的间接水平解决#34;通过使n
成为一个列表(并始终使用和分配n[0]
),您在某种意义上说明了拯救生命"额外的间接水平"。
答案 1 :(得分:0)
好的,经过一些测试,我意识到这一切都与变量的重新分配有关。
例如:
def main(): #global
n = 1
z = None
def addone(): #local
if not z:
x = n+1
addone()
print n
main()
当我进入n
函数时,现在显示z
和addone()
。这是因为我不再尝试重新分配n
,这对我来说是有意义的,以便在全局变量在本地函数中使用类似名称时保护全局变量不被操纵。