鱼C论坛

 找回密码
 立即注册
查看: 833|回复: 2

[已解决]global函数的问题,求解

[复制链接]
发表于 2019-3-16 16:47:04 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
def add_b():
    #global  b
    b = 42
    def do_global():
        global  b
        b =  10          #(1)
        print(b)          #(2)
    do_global()
    print(b)
add_b()
print(" b = %s " % b) #(3)

结果如下:
10
42
b = 10

为什么(2)的print函数的结果为42,之前不是定义b为全局变量并赋值为10了吗?


代码及结果如下
一、
def add_b():
    #global  b
    #b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    #b  = b + 20
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)
复制代码
以上代码输出:

10
10
b = 40



二、
def add_b():
    #global  b
    #b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    b  = b + 20
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)
复制代码
以上代码报错:

b = b + 20
UnboundLocalError: local variable 'b' referenced before assignment



三、
def add_b():
    #global  b
    b = 42
    def do_global():
        global  b
        b =  10
        print(b)
    do_global()
    b  = b + 5
    print(b)
add_b()
b = b + 30
print(" b = %s " % b)
复制代码
以上代码输出:

10
47
b = 40

二与一相比,在内嵌函数中多了一行  b  = b + 20,b不是已经在 do_global()函数中被定义为全局函数了吗,为什么在运行时仍然被定义为没有定义
三中,变量b在函数 do_global()中已经被定义为全局变量并赋予为10,为什么在执行b = b+5时,b的值是42,不是10
最佳答案
2019-3-16 19:02:32
你的问题比较简单,在解释之前,首先记住python的屏蔽机制:就是当调用函数内部的变量与全局变量冲突的时候,函数内部的变量会被保护起来,而不受全局变量的影响,简单说就是函数在栈内,全局变量在外面,函数只会访问栈内的变量。
下面逐条解释如下:
第一部分:42是add_b()内的print,不是do_global()内的print(),就是说b=42是外部函数的的变量,不会受到影响,依然打印出42;
第二部分:
第一个疑问:程序段一声明的全局变量,也就是说全局变量b在整个程序段外侧(即与def add_b()函数并列),故整个计算过程不受影响
程序段二,虽然声明了全局变量,但全局变量在整个程序段外侧,变量b与def add_b()函数并列,所以在函数内部进行b=b+20计算时,因为b与全局变量重名,所以函数会自己搞个b,但是这个b呢,又没有提前定义,所以才出现这个报错;
第二个疑问:全局变量b声明以后,会与def add_b()函数并列,所以在def add_b()函数内部计算时,因内部变量b与全局变量b重名,所以屏蔽机制作用,在此函数内b只会是42,不会是10.
小伙伴明白了吗?  其实整个过程就是一个屏蔽机制在起作用,理解了就明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-16 19:02:32 | 显示全部楼层    本楼为最佳答案   
你的问题比较简单,在解释之前,首先记住python的屏蔽机制:就是当调用函数内部的变量与全局变量冲突的时候,函数内部的变量会被保护起来,而不受全局变量的影响,简单说就是函数在栈内,全局变量在外面,函数只会访问栈内的变量。
下面逐条解释如下:
第一部分:42是add_b()内的print,不是do_global()内的print(),就是说b=42是外部函数的的变量,不会受到影响,依然打印出42;
第二部分:
第一个疑问:程序段一声明的全局变量,也就是说全局变量b在整个程序段外侧(即与def add_b()函数并列),故整个计算过程不受影响
程序段二,虽然声明了全局变量,但全局变量在整个程序段外侧,变量b与def add_b()函数并列,所以在函数内部进行b=b+20计算时,因为b与全局变量重名,所以函数会自己搞个b,但是这个b呢,又没有提前定义,所以才出现这个报错;
第二个疑问:全局变量b声明以后,会与def add_b()函数并列,所以在def add_b()函数内部计算时,因内部变量b与全局变量b重名,所以屏蔽机制作用,在此函数内b只会是42,不会是10.
小伙伴明白了吗?  其实整个过程就是一个屏蔽机制在起作用,理解了就明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-17 16:45:20 | 显示全部楼层
一X一 发表于 2019-3-16 19:02
你的问题比较简单,在解释之前,首先记住python的屏蔽机制:就是当调用函数内部的变量与全局变量冲突的时候 ...

谢谢,已经可以理解。这几题的主要问题就是我没有完全理解函数内变量、全局变量与函数外变量的相互关系,非常感谢您的指点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-11 07:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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