python基础之变量的作用域(6)

变量的作用域:变量的有效范围

分类:
全局变量:在函数内外都有效的变量就是全局变量(使用global关键字声明)
局部变量:仅仅在函数内部有效的变量就是局部变量

num = 1 # 暂且称呼num 为全局变量
def func():
    print(num)
func()
print(num)


# def func():
#     num = 1  #局部变量
#     print(num)
# func()
# print(num)
  • 手术麻醉:
  • 全身麻醉:相当于全局变量
  • 局部麻醉:相当于局部变量

全局变量(特征):
1.在函数外部可以正常访问
2.在函数内部也可以正常访问

局部变量(特征):
1.在函数外部不可以访问
2.在函数内部可以访问

locals() 获取当前作用域的变量(在局部中,是获取locals()之前的所有变量)

def func():
    num = 1
    num2 = 2
    print(locals())
func()

globals() 获取当前位置的全部全局变量。

globals() 获取全局变量
num = 1
def func():
    num2 = 2
    print(globals())
func()

  • 将局部变量提升为真正的全局变量
  • global 变量1,变量2,…
  • global 提升的全局变量是真正的全局变量
def func():
    global num,num2
    num2 = 2
    num = 1
func()
print(num)
print(num2)

num = 3
def func():
    global num
    num = 2
    print(num)
func()
print(num)
#结果为2 2



# 函数的嵌套

def out():  # 外层的函数
    print("外层函数的打印结果:")  # 1
    def inner(): # 内层的函数
        num1 = 1
        print("内层函数的打印结果:") #2
    inner()
out()


# 定义一个函数

num = 1
def func():
    global num
    num = 1
    print(num)  # 1 == > 1
func()
num += 1
print(num) # 2 ==> 2
  • nonlocal
  • 适用于在局部函数中的局部函数, 把内层的局部变量设置成上一个外层局部可用,但是还不是全局的。他与global可以混合使用.
def out():
    num = 1
    def inner():
        nonlocal num
        num += 1
        print(num)
    inner()
out()

#三层函数
def out():
    num = 3
    def middule():
        num = 1
        def inner():
            nonlocal num
            num += 1
            print(num)  
        inner()
        print(num)  
    middule()
    print(num)  
out()
#结果2 2 3

num = 1 # === 2
def out():
    global num
    num += 1 # num === 2
    def middle():
        num = 4  # ====5
        def inner():
            nonlocal num
            num += 1  # ====5
            print(num) # 1 ==>5
        inner()
        print(num) # 2  == > 5
    middle()
    print(num) # 3  ==>2
out()
print(num) # 4  ==> 2

#结果5 5 2 2


def scope_test():
    def do_local():
        spam = "局部变量"  # 1
    def do_nonlocal():
        nonlocal spam  # 使用外层的spam变量
        spam = "nonlocal 变量"  # 2
    def do_global():
        global spam
        spam = "global 变量"  # 3
    spam = "test spam" # 4
    do_local()
    print("本地分配后:", spam) # 4
    do_nonlocal()
    print("nonlocal分配后:", spam) # 2
    do_global()
    print("global分配后:", spam) # 2
scope_test()
print("全局范围:", spam)

#结果:
本地分配后: test spam
nonlocal分配后: nonlocal 变量
global分配后: nonlocal 变量
全局范围: global 变量



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值