鱼C论坛

 找回密码
 立即注册
查看: 6236|回复: 14

[知识点备忘] 第044讲:函数(IV)

[复制链接]
发表于 2021-12-24 01:40:17 | 显示全部楼层 |阅读模式
购买主题 已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-25 10:03:44 | 显示全部楼层
这节课探讨的是作用域,即一个变量可以被访问的范围,由其在代码中被赋值的位置来决定,包括局部作用域(局部变量)和全局作用域(全局变量)。函数中的局部变量会覆盖同名的全局变量;全局变量可以在函数的内部被访问到,却无法在函数中修改它的值,这也是Python的一种保护机制。可使用global语句明确在函数内部修改全局变量,但这种做法并不提倡。嵌套函数的内部函数无法直接被调用,只能通过外部函数来调用;内部函数可以访问外部函数的变量,却无法修改它。可使用nonlocal语句明确在内部函数修改外部函数的变量,但这种做法也不提倡,正所谓“Python只会劝你从良,但从来不会阻止你犯罪”!
视频最后讲解了“LEGB规则”,即Python变量的解析顺序为:Local(局部作用域)→Enclosed(嵌套函数的外层作用域)→Global(全局作用域)→Build-In(内置作用域)。掌握了这一规则,我们就知道Python如何解决不同作用域间的变量出现冲突的问题啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

发表于 2022-4-11 15:24:25 | 显示全部楼层
>>> def myfunc():
        x=520
        print(x)

       
>>> myfunc()
520
>>> print(x)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print(x)
NameError: name 'x' is not defined
>>> x=880
>>> def myfunc()
SyntaxError: invalid syntax
>>> def myfunc():
        print(x)

       
>>> myfunc()
880
>>> def myfunc():
        x=520
        print(x)

       
>>> myfunc()
520
>>> print(x)
880
>>> x=880
>>> id(x)
2567052254064
>>> def myfunc():
        x=520
        print(id(x))

       
>>> myfunc()
2567052938160
>>> id(x)
2567052254064
>>> x=880
>>> def myfunc():
        global x
        x=520
        print(x)

       
>>> myfunc()
520
>>> print(x)
520
>>> def funA():
        x=520
        def funB():
                x=880
                print("In funB,x=",x)

               
>>> def funA():
        x=520
        def funB():
                x=880
                print("In funB,x=",x)
        print("In funA,x=",x)

       
>>> funB()
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    funB()
NameError: name 'funB' is not defined
>>> #内部函数无法直接调用
>>> def funA():
        x=520
        def funB():
                x=880
                print("In funB,x=",x)
        funB()
        print("In funA,x=",x)

       
>>> funA()
In funB,x= 880
In funA,x= 520
>>> #内部函数可以访问外部函数的变量,但不是改变其赋值
>>> def funA():
        x=520
        def funB():
                nonlocal x
                x=880
                print("In funB,x=",x)
        funB()
        print("In funA,x=",x)

       
>>> funA()
In funB,x= 880
In funA,x= 880
>>> #LEGB L 是local 局部作用域(含嵌套函数的内层作用域),E Enclosed嵌套函数的外层的作用域
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-5 23:10:08 | 显示全部楼层
对于最后的一部分,可以使用del函数删除变量,使其恢复原状
>>> str = "小甲鱼把str给毁了"
>>> str(520)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    str(520)
TypeError: 'str' object is not callable
>>> str
'小甲鱼把str给毁了'
>>> 
>>> del str
>>> str(520)
'520'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 16:14:09 | 显示全部楼层
越来越难啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 17:14:51 | 显示全部楼层
LEG+B很棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-12 15:12:26 | 显示全部楼层
滴滴滴~打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-19 17:41:44 | 显示全部楼层
视频最后讲解了“LEGB规则”,即Python变量的解析顺序为:Local(局部作用域)→Enclosed(嵌套函数的外层作用域)→Global(全局作用域)→Build-In(内置作用域)。掌握了这一规则,我们就知道Python如何解决不同作用域间的变量出现冲突的问题啦!
重点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-7 11:54:47 | 显示全部楼层
Learning...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-25 22:02:07 | 显示全部楼层
本帖最后由 jgz1818 于 2022-11-25 22:03 编辑

file:///C:/Users/Administrator/Desktop/def%E5%86%85%E5%B5%8C%E5%A5%97.png
怎么是上传图片?这样么?
教材上的应该是错的吧?

教材上的6.6.4章
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-30 15:00:46 | 显示全部楼层
L 是 Local,是局部作用域
E 是 Enclosed,是嵌套函数的外层函数作用域
G 是 Global,是全局作用域
B 是 Build-In,也就是内置作用域
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-31 19:28:25 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-1 10:12:22 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-10 16:51:45 | 显示全部楼层
leg+G 很好记
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 18:06:06 | 显示全部楼层
覆盖只是在函数中覆盖,出了函数,全局变量还是全局变量
课后习题第6题还是好难理解,为什么全局变量不存在就不会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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