ly-chengwu 发表于 2020-4-1 22:53:00

如果没有红色行的说明,会报什么错,为什么会报错?

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)
'''

sunrise085 发表于 2020-4-1 23:23:57

没有红色两行的话,会报错,局部变量在没有声明之前进行了调用。
因为你在def move函数中直接对cordx和cordy这两个变量进行了自加,程序在def move函数中找不到这两个变量的声明定义,因此报错,
若是加上这两行代码,就指明了这两个变量使用的不是局部变量,是def move函数外的同名变量,即def rundist中的cordx和cordy

_荟桐_ 发表于 2020-4-2 08:43:01

因为函数内只能修改函数内的变量
外面只能修改外面的

如果你在函数里给他重新赋值时
就会在函数内创建一个同名的变量,但地址不同
如果给他+1,-1....时就会提示没这个变量

这时用global,就是让函数内可以访问外面的

还有就是有内嵌函数
用nonlocal
可以让内层的函数修改外层的变量

Twilight6 发表于 2020-4-2 08:57:06

本帖最后由 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

zltzlt 发表于 2020-4-2 13:07:28

会报局部变量不存在的错,因为在 move() 函数中 Python 默认把上层函数的变量给屏蔽了,而你下面又对 cordx 和 cordy 进行了自加操作,Python 在 move() 中找不到 cordx 和 cordy ,所以会报错。

需要在 move() 函数定义后写上 nonlocal,告诉 Python 这个变量是从 rundist() 来的
页: [1]
查看完整版本: 如果没有红色行的说明,会报什么错,为什么会报错?