CSIC_716_20191111【函数对象、名称空间、作用域、global 和nonlocal】
2024-09-07 22:09:22
函数名是可以被引用,传递的是函数的内存地址。函数名赋值给变量后,只需要在变量后加上括号即可调用函数。
名称空间
内置名称空间:在python解释器中提前定义完的名字
全局名称空间:if、while、for循环中内部定义的变量,均是全局变量;存放于文件级别的变量,也是全局名称。
局部名称空间:函数内定义的所有名称,均存放在当前函数的名称空间,属于局部名称空间。
生命周期
内置名称空间:解释器生效内置名称空间即生效,解释器关闭即失效。
全局名称空间:.py文件生效全局名称空间生效,代码执行结束后失效。
局部名称空间:调用当前函数时失效,函数体代码执行结束失效。
名称空间查找顺序
局部名称空间:先找局部的,再找全局的,最后找内置的
全局名称空间:先找全局的,最后找内置的
global和nonlocal
如果在局部空间中申明global,被申明的变量会被当成全局变量。对其赋值会更新原先定义的同名全局变量的值。
如果在局部空间中声明nonlocal,被申明的变量一定要在函数嵌套的第二级及以后,且前面一定要有同名的局部变量。
如果函数体中没有嵌套函数,函数体中是不能使用nonlocal声明变量。
nonlocal x会从当前函数的外层函数开始,一层层去查找名字X,若是一直到最外层函数都找不到,则会报错。举例如下:
def f3():
x = 4
def f1():
y = 2
def f2():
nonlocal x
x = 3
f2()
print(x) # 3
f1()
print(x) # 3
f3()
def f3():
x = 4
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x) # 3
f1()
print(x) # 4
f3()
函数体循环时,会从内往外找要寻找的值,先局部后全局,最后找内置。如果下级循环中没有值,会忘外层寻找,直到找到位置,遇到局部的global也会取其值,如下代码所示。(注意理解)
x=0
def func1():
x = 1
def func2():
global x
x = 2
def func3():
print(x, 'func3') # 2 func3
func3()
print(x, 'func2') # 2 func2
func2()
print(x,'func1') # 1 func1
func1()
print( x,'all') # 2 all
最新文章
- Tween公式 以及四个参数
- IAP
- 数论 UVA 10791
- bootstrap添加时间控件
- Ajaxupload.js上传插件使用
- 【VNC】Linux环境VNC服务安装、配置与使用
- 配置php中的Oracle扩展
- vector数据查找方法
- Quartz 2D中的基本图形绘制
- HDU1686:Oulipo
- laravel Schema 查看索引是否存在
- ADC自动转接功能Lua实现
- Oracle 非归档--归档操作流程
- curl工具介绍和常用命令
- nc命令简介
- B 树、B+ 树、B* 树
- Docker logs 命令
- WPF 自定义MenuItem样式
- JavaScript数据结构-9.循环链表
- #leetcode刷题之路41-缺失的第一个正数
热门文章
- Python 变量作用域 LEGB (下)—— Enclosing function locals
- C#实体类克隆
- 百度网盘Mac版如何分享链接?创建百度网盘 for Mac分享链接的方法
- WPS Office for Mac如何修改Word文档文字排列?WPS office修改Word文档文字排列方向教程
- Jmeter-【beanshell处理器】-随机数(数字、字母、特殊符号、混合)
- windows 登陆服务器
- linux安装MySQL-5.6.22-1.el6.i686.rpm-bundle.tar
- kafka的简单命令
- NX二次开发-UFUN输入表达式TAG,得到表达式值UF_MODL_ask_exp_tag_value
- NX二次开发-UFUN和NXOpen结合开发中Tag_t对象与TaggedObject对象转换方法