前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 变量的作用域

Python 变量的作用域

作者头像
星哥玩云
发布2022-09-08 11:55:36
7640
发布2022-09-08 11:55:36
举报
文章被收录于专栏:开源部署

一、作用域介绍

概念

变量可以使用的范围,程序的变量并不是哪个位置都可以访问的,访问的权限决定于变量时在哪里定义的

作用域的划分

  1. 局部作用域(L)
  2. 闭包函数外到函数中(E)
  3. 全局作用域(G)
  4. 内建作用域(B)

变量查找的规则

L->E->G->B

注意

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这这些语句内定义的变量,外部也可以访问

二、体现作用域

代码语言:javascript
复制
num1 = 1

if 1:
    num2 = 2
    print("num1 = %d"%num1)
    print("num2 = %d"%num2)
print("num2 = %d"%num2)

def func():
    # num1 = 100 # 和外面的num1不是同一个变量,相当于在局部作用域中定义了一个名为num1的局部变量
    num3 = 3
    print("func-num1 = %d" % num1)
    print("func-num2 = %d" % num2)
    def f():
        print("f-num1 = %d" % num1)
        print("f-num2 = %d" % num2)
        print("f-num3 = %d" % num3)
    f()
    print("func-num3 = %d" % num3)

func()
# print("-num3 = %d" % num3)
print(num1)

三、修改全局变量的值

代码语言:javascript
复制
num = 401
print(id(num))
def func():
    num = 402# 和外面的num不是同一个变量,相当于在局部作用域中定义了一个名为num的局部变量
    print(id(num))
    print("1-", num)
func()
print("2-", num)
代码语言:javascript
复制
num = 401
print(id(num))
def func():
    # 修改全局变量的值需要将变量声明为全局变量
    global num
    num = 402
    #在函数的内部可以直接获取全局变量的值,但是不能直接修改全局变量。直接修改全局变量相当于在局部作用域中新建一个局部变量
    print("1-", num)
func()
print("2-", num)

四、修改嵌套作用域中变量的值

代码语言:javascript
复制
a = 1
def func1():
    a = 2
    c = 3
    def func2():
        nonlocal a
        a = 100
        #想要修改嵌套作用域中的变量,需要将其声明成嵌套作用域中的变量
        nonlocal c
        c = 4 #如果直接赋值修改相当于在当前作用域定义了一个局部变量
        # 可以直接获取嵌套作用域中变量的值
        print("func2--c =", c)
        print("func2--a =", a)
    func2()
    print("func1--c =", c)
    print("func1--a =", a)

func1()
print("func--a =", a)

五、闭包

作用域链

代码语言:javascript
复制
a = 1
def func1():
    b = 2
    def fucn2():
        c = 3
        def func3():
            return a + b + c

func1()

使用闭包突破作用域链

概念:在函数体中定义内部函数,并且使用外部函数的变量,然后把内部函数返回,那么这个内部函数就是闭包

优点:避免污染全局环境,这样就可以在函数体外使用函数体中定义的变量

缺点:数据会长期驻留在内存中,造成内存极大的浪费 注意:尽量避免使用闭包

代码语言:javascript
复制
def func1():
    b = 2
    def func2():
        return b
    return func2

f2 = func1()
print(f2())

可能遇到闭包的坑

代码语言:javascript
复制
def func():
    arr = []
    for i in range(3):
        def f():
            print("-----------", i)
        arr.append(f)
    return arr

li = func()
li[0]()
li[1]()
li[2]()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、作用域介绍
  • 二、体现作用域
  • 三、修改全局变量的值
  • 四、修改嵌套作用域中变量的值
  • 五、闭包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档