鱼C论坛

 找回密码
 立即注册
查看: 899|回复: 4

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

[复制链接]
发表于 2020-4-1 22:53:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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)
'''
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 23:23:57 | 显示全部楼层
没有红色两行的话,会报错,局部变量在没有声明之前进行了调用。
因为你在def move函数中直接对cordx和cordy这两个变量进行了自加,程序在def move函数中找不到这两个变量的声明定义,因此报错,
若是加上这两行代码,就指明了这两个变量使用的不是局部变量,是def move函数外的同名变量,即def rundist中的cordx和cordy
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 08:43:01 | 显示全部楼层
因为函数内只能修改函数内的变量
外面只能修改外面的

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

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

还有就是有内嵌函数
用nonlocal
可以让内层的函数修改外层的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 08:57:06 | 显示全部楼层
本帖最后由 Twilight6 于 2020-4-2 08:59 编辑

这位童鞋  ,上小甲鱼课没认真了吧! 哈哈
小甲鱼有解释过 屏蔽这个名词   建议你可以回  20课时看看  小甲鱼解释 屏蔽(Shadowing)  

如果懒的回去看   那可以看看下面 :
如果 我们在函数内部 试图修改一个全局变量   python 就会在内部函数创建一个与全局变量命名一模一样的局部变量 来屏蔽全局变量  这样的话 内部函数的修改只会修改内部函数的局部变量的值  
但你如果加上 nonlocal     就是相当于给python 一个提醒 , nonlocal xxx    ,就是给python 提醒了! xxx  不是局部变量  ,那python就知道xxx  不是局部变量 而是全局变量了 , 那么就可以进行对全局变量的改变
没加nonlocal的话 这个内部函数运行结束了  就等于不存在 当时创造出来的和全局变量一模一样命名的局部变量

全局变量就等于没有改变  

可以的话  你懂的哈哈哈


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 13:07:28 | 显示全部楼层
会报局部变量不存在的错,因为在 move() 函数中 Python 默认把上层函数的变量给屏蔽了,而你下面又对 cordx 和 cordy 进行了自加操作,Python 在 move() 中找不到 cordx 和 cordy ,所以会报错。

需要在 move() 函数定义后写上 nonlocal,告诉 Python 这个变量是从 rundist() 来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-27 14:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表