如果没有红色行的说明,会报什么错,为什么会报错?
def rundist(x,y):cordx,cordy=x,y
def move(**kwargs):
nonlocal cordx
nonlocal cordy
if 'x' in kwargs.keys():
cordx+=kwargs['x']
if 'y' in kwargs.keys():
cordy+=kwargs['y']
print('current position (%d,%d)'%(cordx,cordy))
return move
if __name__=='__main__':
mv=rundist(0,0)
mv(x=5,y=6)
mv(x=-3)
mv(y=-7)
'''
current position (5,6)
current position (2,6)
current position (2,-1)
''' 没有红色两行的话,会报错,局部变量在没有声明之前进行了调用。
因为你在def move函数中直接对cordx和cordy这两个变量进行了自加,程序在def move函数中找不到这两个变量的声明定义,因此报错,
若是加上这两行代码,就指明了这两个变量使用的不是局部变量,是def move函数外的同名变量,即def rundist中的cordx和cordy 因为函数内只能修改函数内的变量
外面只能修改外面的
如果你在函数里给他重新赋值时
就会在函数内创建一个同名的变量,但地址不同
如果给他+1,-1....时就会提示没这个变量
这时用global,就是让函数内可以访问外面的
还有就是有内嵌函数
用nonlocal
可以让内层的函数修改外层的变量 本帖最后由 Twilight6 于 2020-4-2 08:59 编辑
这位童鞋,上小甲鱼课没认真了吧! 哈哈
小甲鱼有解释过 屏蔽这个名词 建议你可以回20课时看看小甲鱼解释 屏蔽(Shadowing)
如果懒的回去看 那可以看看下面 :
如果 我们在函数内部 试图修改一个全局变量 python 就会在内部函数创建一个与全局变量命名一模一样的局部变量 来屏蔽全局变量这样的话 内部函数的修改只会修改内部函数的局部变量的值
但你如果加上 nonlocal 就是相当于给python 一个提醒 , nonlocal xxx ,就是给python 提醒了! xxx不是局部变量,那python就知道xxx不是局部变量 而是全局变量了 , 那么就可以进行对全局变量的改变
没加nonlocal的话 这个内部函数运行结束了就等于不存在 当时创造出来的和全局变量一模一样命名的局部变量
全局变量就等于没有改变
可以的话你懂的哈哈哈
https://xxx.ilovefishc.com/album/202003/31/111806sdzhrkjo4ak3px51.jpg 会报局部变量不存在的错,因为在 move() 函数中 Python 默认把上层函数的变量给屏蔽了,而你下面又对 cordx 和 cordy 进行了自加操作,Python 在 move() 中找不到 cordx 和 cordy ,所以会报错。
需要在 move() 函数定义后写上 nonlocal,告诉 Python 这个变量是从 rundist() 来的
页:
[1]