文章目录

  • 一 变量作用域
    • 1. Local(局部变量)
    • 2. Enclosed(嵌套)
    • 3. Global(全局)
    • 4. Built-in(内置)
  • 二 变量使用规则
  • 三 变量的修改
    • 1. global修改全局变量
    • 2. nonlocal修改外层函数变量

一 变量作用域

python变量作用域一般有4种,如下

1. Local(局部变量)

  • Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡。如下
#局部作用域
def fun():b = 2print(b)#输出2fun()
print(b)#报错
>>>
2
Traceback (most recent call last):File "C:/Users/admin/python-learning/python学习文件/python基础/CSDN.py", line 14, in <module>print(b)
NameError: name 'b' is not defined

2. Enclosed(嵌套)

  • Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
#Enclosed(嵌套)作用域
def fun1():b = 2print("这是fun1打印的:", b)def fun2():print("这是fun2打印的:", b)return fun2temp = fun1()#调用fun1
temp()#调用fun2

在这里函数fun2里面并没有定义变量b,但是它能够引用外层函数fun1定义的b变量,此时变量b的作用域就是Enclosed. 结果如下

>>>
这是fun1打印的: 2
这是fun2打印的: 2

3. Global(全局)

  • Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模
    块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。
#Global(全局)作用域
a = 2
def fun1():print("这是fun1打印的:", a)fun1()
print(a)
>>>
这是fun1打印的: 2
2

4. Built-in(内置)

  • Built-in(内置):解释器内置的变量,比如int, str等。

二 变量使用规则

python中变量的使用遵循上面的四种规则,即LEGB规则,如下

  • 创建变量时从上往下创建,搜索变量时从下往上搜索。
  • 创建变量时,下层变量会覆盖上层同名变量,但不会改变上层变量的值,除非使用gloable和nonlocal关键字声明

三 变量的修改

1. global修改全局变量

一般全局变量一经定义后几乎是不用改的,也不允许在局部修改全局变量,除非使用Global关键字声明。如下

a = "我是全局变量"
def fun1():a += "但是是修改后的全局变量"#修改全局变量print(a)fun1()
>>>
UnboundLocalError: local variable 'a' referenced before assignment

可以看到,当我们试图在函数fun1创建的局部作用域内改变全局变量a就会报错,但如果在修改之前使用global关键字声明时,就会正常修改外部的全局变量a,如下

a = "我是全局变量"
def fun1():global a    #使用global声明a += ",但是是修改后的全局变量"#修改全局变量print(a)print(a)#fun1函数修改前
fun1()
print(a)#fun1函数修改后
>>>
我是全局变量
我是全局变量,但是是修改后的全局变量
我是全局变量,但是是修改后的全局变量

2. nonlocal修改外层函数变量

在函数中嵌套函数时,嵌套在里面的函数创建的作用域内一般也是不允许改变外层函数变量的值的,除非是nonlocal关键字声明。如下

#不使用nonocal声明,修改外层函数变量值
def fun1():a = "我是fun1的变量"def fun2():a += ",但是我是修改后的"print(a)return fun2temp = fun1()#调用fun1
temp()#调用fun2
>>>
UnboundLocalError: local variable 'a' referenced before assignment

可以看到,报错和在函数内不使用global修改全局变量报的错是一样的,当使用nonlocal声明后再修改就不会报错了,如下

#使用nonocal声明,修改外层函数变量值
def fun1():a = "我是fun1的变量"print(a)#修改前def fun2():nonlocal a  #使用nonlocal声明a += ",但是我是修改后的"print(a)#修改后return fun2temp = fun1()#调用fun1
temp()#调用fun2
>>>
我是fun1的变量
我是fun1的变量,但是我是修改后的

可以看到是正常修改的。

Python之变量作用域相关推荐

  1. python中变量作用域

    python中变量作用域采取以下规则: 1.python能够改变变量作用域的代码段是def.class.lamda. 2.if/elif/else.try/except/finally.for/whi ...

  2. Python中变量作用域问题

    我们经常听说Python函数访问局部变量.全局变量:在定义装饰器的时候,还会使用自由变量.这些不同的变量是如何赋值.初始化.查找及修改的呢?各自的作用细则又是什么样的呢?本篇尝试解答这个问题. Pyt ...

  3. python legb_Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只 ...

  4. Python 的变量作用域和 LEGB 原则

    在 Python 程序中创建.改变或查找变量名时,都是在一个保存变量名的地方进行中,那个地方我们称之为命名空间.作用域这个术语也称之为命名空间. 具体地说,在代码中变量名被赋值(Python 中变量声 ...

  5. python函数变量的作用域_学不会的Python函数——变量作用域

    1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...

  6. Python基础-变量作用域

    1.函数作用域介绍 函数作用域 Python中函数作用域分为4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局 ...

  7. python的变量作用域

    1. 不在函数体内的变量或者在 if __name__=='__main__'中的变量,都是全局变量,注意访问这些全局变量的速度是比较慢的,因为这些全局变量放在一个全局的表中,需要查找 2. 在函数体 ...

  8. python sizeof_python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗 赋值语句的原理...

    CPython implementation detail: This is the address of the object in memory. copy - Shallow and deep ...

  9. Python变量作用域的规则以及如何搜索内置作用域

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦! **作用域:**是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围 ...

最新文章

  1. 如何使用Mockito模拟void方法
  2. Codeforces Round #737 (Div. 2)
  3. mysql表变量临时表_表变量和临时表详解
  4. 互联网日报 | 3月7日 星期日 | 《你好,李焕英》成中国影史票房亚军;丰巢新增智能存包柜业务;特斯拉推出内部社交平台...
  5. 简单英文题 26 The Nearest Number(python)
  6. 如何使用sqlpackage和PowerShell将示例bacpac文件导入到Azure SQL数据库
  7. 关于shopex友情链接的添加以及首页调用问题
  8. 牛逼!40行Python代码一键把html网页保存为pdf,太方便了!
  9. ipmitool 工具的使用姿势
  10. https://www.cnblogs.com/h2zZhou/p/5440271.html
  11. Win11无法识别以太网怎么办?Win11以太网未识别网络的解决方法
  12. 孢子社群:今日推荐人工智能微信群:粤、沪、鄂人工智能产业化集群1
  13. [BZOJ3240][Noi2013]矩阵游戏 快速幂
  14. 【大四上学期】过程控制系统课程笔记
  15. NLP 分类问题的讨论
  16. icloud有linux客户端吗,icloud drive:Windows 版 iCloud 客户端在哪下载
  17. 在上海相亲碰到如此势利贪婪的“80后”女孩
  18. 使用T-SQL语句插入、更新、删除数据表
  19. 交换机路由器端口配置
  20. 【解决报错原因分析】画图plt.contourf(X,Y,Z)报错TypeError: unhashable type: ‘numpy.ndarray‘(含详细示例讲解)

热门文章

  1. python覆盖数据库重复数据_Python操作MySQL数据库,插入重复数据
  2. 运行时异常和非运行时异常
  3. 有向无环图(DAG)技术白话解读
  4. NetVideoHunter Video Downloader
  5. Android OpenGL ES 学习(五) -- 渐变色
  6. tinyurl_如何查看TinyUrl真正链接到的位置
  7. 积极达成:处理好情绪再处理问题
  8. ros-gazeble
  9. Python调用C语言(DLL)
  10. SIGKILL与SIGTERM的区别