喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦!

**作用域:**是指变量的生效范围,例如本地变量、全局变量描述的就是不同的生效范围。

python的变量作用域的规则非常简单,可以说是所有语言中最直观、最容易理解的作用域。

在开始介绍作用域之前,先抛一个问题:

1 x=1
2 def f():
3 x=34 g()
5 print("f:",x)
# 3
6
7 def g():
8 print("g:",x)
# 1
9
10 f()
11 print("main:",x)
# 1

上面的代码将输出3、1、1。

python作用域规则简介

**它有4个层次的作用域范围:**内部嵌套函数、包含内部嵌套函数的函数自身、全局作用域、内置作用域。上面4个作用域的范围排序是按照从内到外,从小到大排序的。

其中:

  • 内置作用域是预先定义好的,在__builtins__模块中。这些名称主要是一些关键字,例如open、range、quit等
  • 全局作用域是文件级别的,或者说是模块级别的,每个py文件中处于顶层的变量都是全局作用域范围内的变量
  • 本地作用域是函数内部属于本函数的作用范围,因为函数可以嵌套函数,嵌套的内层函数有自身的内层范围
  • 嵌套函数的本地作用域是属于内层函数的范围,不属于外层

所以对于下面这段python代码来说,如果它处于a.py文件中,且没有嵌套在其它函数内:

1 X=1
2 def out1(i):
3 X=2
4 Y='a'
5 print(X)
6 print(i)
7 def in1(n):
8 print(n)
9 print(X,Y)
10 in1(3)
11 out1(2)

那么:

处于全局作用域范围的变量有:X、out1

处于out1本地作用域范围的变量有:i、X、Y、in1

处于嵌套在函数out1内部的函数in1的本地作用域范围的变量有:n

注意上面的函数名out1和in1也是一种变量

如下图所示:

搜索规则

当在某个范围引用某个变量的时候,将从它所在的层次开始搜索变量是否存在,不存在则向外层继续搜索。搜索到了,则立即停止

例如函数ab()中嵌套了一个函数cd(),cd()中有一个语句print(x),它将首先检查cd()函数的本地作用域内是否有x,如果没有则继续检查外部函数ab()的本地作用域范围内是否有x,如果没有则再次向外搜索全局范围内的变量x,如果还是没有,则继续搜索内置作用域,像"x"这种变量名,在内置作用域范围内是不存在的,所以最终没有搜索到,报错。如果一开始在cd()中就已经找到了变量x,就不会再搜索ab()范围以及更外层的范围。

所以,内层范围可以引用外层范围的变量,外层范围不包括内层范围的变量

内置作用域

内置作用域主要是一些内置的函数名、内置的异常等关键字。例如open,range,quit等。

两种方式可以搜索内置作用域:一是直接导入builtins模块,二是让python自动搜索。导入builtins模块会让内置作用域内的变量直接置于当前文件的全局范围,自动搜索内置作用域则是最后的阶段进行搜索。

一般来说无需手动导入builtins模块,不过可以看看这个模块中包含了哪些内置变量。

1 >>> import builtins
2 >>> dir(builtins)
3 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', ...............
4 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!

我是一名python开发工程师,整理了一套python的学习资料,如果你想提升自己,对编程感兴趣,关注我并在后台私信小编:“08”即可免费领取资料!希望对你能有所帮助

Python变量作用域的规则以及如何搜索内置作用域相关推荐

  1. python内置作用域_python中的作用域

    python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:glo ...

  2. Python 入门 —— Python 面向对象:类的创建及其基本内置方法的使用

    Python 面向对象:类的创建及其基本内置方法的使用 首先了解一下什么是面向对象 面向过程: 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ...

  3. 一木.溪桥学Python-09:函数的返回值、函数的作用域、作用域的优先级、递归函数、内置文件中常用方法、匿名函数lambda、高阶函数

    一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-09:函数的返回值.作用域.作用域的优先级.递归函数.内置文件中常用方法.匿名 ...

  4. python葵花宝典第15式-匿名函数、内置函数、映射函数

    python葵花宝典第15式-匿名函数.内置函数.映射函数 15.1 lambda函数(匿名函数) 匿名函数并不是没有函数名字 注意: (1)函数的参数可以有多个,多个参数之间用逗号隔开 (2)匿名函 ...

  5. python变量定义的规则_Python基础教程(2)Python变量与注释

    一.Python变量定义规则 在Python中定义变量的方式和Shell很像,有以下规则: 1.变量名只能是字母.数字或者下划线的组合,不能有空格或者其他特殊字符,且第一个字符不能是数字 2.使用变量 ...

  6. Python 变量函数命名规则

    Python 变量命名规则 模块名 & 包名 纯小写字母,单词之间用 _ 分割 类名 首字母大写,不用 _ 分割 全局变量名(类似于 Java 中的 static 变量) 纯大写,单词之间用 ...

  7. python内置作用域_python内置金融数据Python 五点搞定作用域

    1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗?#块级作用域 if 1 == 1: name = "lzl" print(name) for i in range( ...

  8. python的变量对大小写并不敏感_Robot Framework 内置变量

    转自:https://blog.csdn.net/qq_26886929/article/details/53907755 Robot Framework 内部提供了一下直接可用的内置变量 1. 操作 ...

  9. Python 函数合集:足足 68 个内置函数请收好

    公众号关注 "视学算法" 设为 "星标",DLCV消息即可送达! 来源:pypypypy www.cnblogs.com/pypypy/p/12011506.h ...

最新文章

  1. avcodec_encode_video2 -22
  2. Spring4MVC 请求参数映射和Content-type
  3. vb中多个串口通讯_VB中的42个关键字,你知道都是哪些吗?
  4. 当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K
  5. 前端基础-jQuery的优点以及用法
  6. scala特质_Scala的特质
  7. 【CodeForces - 190E】Counter Attack (补图bfs,卡常,dsu)
  8. Java多线程——线程范围内共享变量和ThreadLocal
  9. 数据挖掘导论(一):数据挖掘的定义,方法,用途
  10. rs485接收中断函数使能_RS485通讯几种常见问题
  11. logistic回归分析优点_SPSS教程|二分类logistic回归及SPSS操作
  12. get请求400错误 vue_VUE 配置proxy代理后,前台报错400 bad request
  13. 拷机测试需要多久_如何科学理解麒麟9000的拷机功耗?
  14. springboot启动时自动关闭问题 com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
  15. 收费企业邮箱哪个好用?怎么购买外贸邮箱?企业邮箱服务有哪些呢?
  16. Linux 从入门到了解
  17. 中美区块链协会海峡分会落户福州
  18. win10 Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。
  19. HTB打靶(Active Directory 101 Sizzle)
  20. 南方地区数据中心节能架构设计——以深圳地区为例

热门文章

  1. 北理工硕士生「一字不差」抄袭顶会投稿,网友:买论文被忽悠了?
  2. 无贡献、无创新、无思路,ML领域准博士求助:论文到底要怎么创新?
  3. CVPR 2020 | 给Deepfake 假脸做 X-Ray,新模型把换脸图打回原形
  4. MySQL数据库修改表结构
  5. 必看干货|成为大数据专业人员必要且重要的7大技能
  6. 哪个瞬间让你突然觉得CV技术真有用?
  7. 计算机视觉不可能凉!
  8. 基于OpenCV的位姿估计
  9. pytorch2——Pytorch基础数据结构——张量(深度之眼)
  10. [转] 先验概率and后验概率