python基础10 -- 变量的作用域

前言 

在第一篇文章中,简单介绍过变量,随着学习的深入,我们知道列表、字典、都有嵌套,再到流程控制语句的嵌套,其实函数也会有嵌套。

----------->

那么,嵌套域变量有什么关系呢?

下面一步步来学习~

变量的作用域

变量的作用域,即变量的生命周期

在python中,变量(LEGB )遵循的规则:local  ---> enclosing ---> global----> builtin

即:

嵌套作用域(local ):函数内嵌套的另一个函数的内部的变量,可以在这个内部函数中访问。

局部作用域(enclosing):在函数内部定义的变量,只能在该函数内部访问。

全局作用域(global):在模块级别定义的变量,可以在模块内的任何位置访问。

内建作用域(builtin):python内置的一些变量和函数,如printlen、sum等,可以直接访问

变量嵌套&局部变量

变量嵌套&局部变量示例代码如下:

属于一个函数嵌套一个函数:

        " bar()"是"foo()"的嵌套子函数。

        如果不写"bar()"的调用,则只会执行"foo()"调用的打印,即只有一个打印结果。

        "bar()"、"foo()"都进行调用,执行打印则会有2个结果。

def foo():
    print("foo...")

    def bar(): #函数再嵌套函数
        print("bar...")
    bar()

#food调用时,会加载bar(),同时执行foo()
foo()


#输出:
foo...
bar...

 不同作用域的变量效果

全局变量、局部变量、函数内部变量的引用:
x = 100  #全局变量

def foo():
    x = 20  #局部变量
    print("foo的x:",x)

    def bar(): #函数再嵌套函数
        x = 5  #嵌套内部变量
        print("bar的x:",x)
    bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)


#输出:
foo的x: 20
bar的x: 5
100

同样:

如果嵌套内部变量被注释,则找的是局部变量

所以下面代码的的执行结果中,"foo的x"和"bar的x"都是20

x = 100  #全局变量
def foo():
    x = 20  #局部变量
    print("foo的x:",x)

    def bar(): #函数再嵌套函数
        # x = 5  #嵌套内部变量
        print("bar的x:",x)
    bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)

#输出:
foo的x: 20
bar的x: 20
100

如果局部变量,也被注释了,则找的是全局变量:

"foo的x"和"bar的x"和"x"的打印结果都是100

x = 100  #全局变量
def foo():
    # x = 20  #局部变量
    print("foo的x:",x)

    def bar(): #函数再嵌套函数
        # x = 5  #嵌套内部变量
        print("bar的x:",x)
    bar()
#food调用时,会加载bar(),同时执行foo()
foo()
print(x)

#输出:
foo的x: 100
bar的x: 100
100

如果全局变量也被注释了,则会报错:

执行代码时候,python会去找内部函数,有没有一个变量叫x的

但是找不到一个变量叫x的,所以报错

找内部函数:

把变量名称改成"sum",这次没有报错,因为sum是python的内部函数

同理:

一个全局变量,两个函数,一个内部变量时

"foo()"调用时,只会在"foo()"的内部找,有没有内部变量,内部找不到,则会找全局变量

x = 100  #全局变量
def foo():
    print("foo的x:",x)


def bar():
    x = 10 #内部变量
    print("bar的x:",x)

foo()
bar()


#输出:
foo的x: 100
bar的x: 10

变量的声明

内部函数修改全局变量值

内部变量进行赋值后,再查看全局变量,仍没有被修改成功

原因还是因为,内部变量与局部变量的关系

age = 35  #全局变量
def update_age():

    age = 18  #内部变量赋值
    print("age:",age)
update_age()
print(age)

#输出:
age: 18
35

但是,如果我就想把局部函数里修改全局变量,怎么办呢?

例如:我就想在内部函数里,将局部变量age修改为18,只需要做一个global声明

age = 35  #全局变量
def update_age():
    global age
    age = 18  #内部变量赋值
    print("age:",age)
update_age()
print(age)


#输出:
age: 18
18
内部函数调用全局变量

当我定义了sub()函数,但是函数内部没有对x赋值时,执行函数调用会报错

因为函数内部找不到x

如果我就想用全局变量的x呢?

也是一样,只需要在函数内部global声明即可:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值