小甲鱼 发表于 2021-12-24 01:40:17

已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览 购买主题

小古比鱼 发表于 2021-12-25 10:03:44

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

小京力 发表于 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嵌套函数的外层的作用域

炎凉来寻 发表于 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'

chenjinchao 发表于 2022-10-4 16:14:09

越来越难啊

foolwolf0068 发表于 2022-10-6 17:14:51

LEG+B很棒

墨墨在努力吖 发表于 2022-10-12 15:12:26

滴滴滴~打卡{:10_298:}

lymbwx 发表于 2022-10-19 17:41:44

视频最后讲解了“LEGB规则”,即Python变量的解析顺序为:Local(局部作用域)→Enclosed(嵌套函数的外层作用域)→Global(全局作用域)→Build-In(内置作用域)。掌握了这一规则,我们就知道Python如何解决不同作用域间的变量出现冲突的问题啦!
重点

migu_sm1 发表于 2022-11-7 11:54:47

Learning...{:10_269:}

jgz1818 发表于 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章

呱呱呱i 发表于 2022-12-30 15:00:46

L 是 Local,是局部作用域
E 是 Enclosed,是嵌套函数的外层函数作用域
G 是 Global,是全局作用域
B 是 Build-In,也就是内置作用域

andyleesh 发表于 2022-12-31 19:28:25

打卡

andyleesh 发表于 2023-1-1 10:12:22

打卡

gengiskhan 发表于 2023-1-10 16:51:45

leg+G 很好记

FengHL 发表于 2023-4-11 18:06:06

覆盖只是在函数中覆盖,出了函数,全局变量还是全局变量
课后习题第6题还是好难理解,为什么全局变量不存在就不会报错

万恶的亚撒西 发表于 4 天前

学习学习-20250603,深刻理解需要慢慢掌握
页: [1]
查看完整版本: 第044讲:函数(IV)