python进阶之命名空间与作用域
命名空间 Namespace
Namespace命名空间,命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值。命名空间的一大作用是避免名字冲突。
python使用命名空间记录变量的轨迹。python中有三个命名空间:
命名空间 |
名称 |
记录数据 |
函数的命名空间 |
局部命名空间 (local namespace) |
记录了函数的参数和局部定义的变量 |
模块的命名空间 |
全局命名空间 (global namespace) |
记录了模块的变量,包括函数,类,其他导入的模块,模块级的变量和常量 |
内置命名空间 |
内置命名空间 (build-in) |
存放内置的函数和异常,例如:abs() |
内置函数 locals(),返回当前函数的局部命名空间
x = 100 def fun():
a = 1
b = 2
print locals()
return a+b fun()
结果:
{'a': 1, 'b': 2}
内置函数globals(),返回当前模块的全局命名空间
x = 100 def fun():
a = 1
b = 2
print locals()
return a+b fun()
print globals() 结果:
{'a': 1, 'b': 2}
{'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'locals.py', '__package__': None, 'x': 100, 'fun': <function fun at 0x7fb18df93668>, '__name__': '__main__', '__doc__': None}
命名空间查找顺序
当代码要使用变量x的值时,Python解释器回到所有可用的命名空间去查找变量,顺序:
- 局部命名空间:当前函数或者类的方法。如果函数定义了一个局部变量x,解释器使用它,停止搜索。
- 在父函数或嵌套的命名空间中搜索
- 全局命名空间,搜索当前的模块,如果模块定义了名为x的变量,函数,或者类,解释器使用它。
- 内置命名空间:对每个模块都是全局的,作为最后的尝试,python将假设x为内置函数或变量。
- 如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。
命名空间的生命周期
- 内置命名空间,python解释器启动时创建,退出时销毁
- 全局命名空间,模块定义被解释器读入时创建,解释器退出时销毁
- 局部命名空间,函数调用时创建,函数返回或者异常时销毁
def fun():
a = 1 fun()
print a Traceback (most recent call last):
File "find_namespce.py", line 6, in <module>
print a
NameError: name 'a' is not defined
作用域
作用域针对变量而言,指申明了变量在程序里的可应用范围。只有函数,类,模块会产生作用域,代码块不会产生作用域。例如for循环,if判断都不产生作用域。
作用域可以划分成4类:
- 局部作用域
- 嵌套作用域
- 全局作用域
- 内建作用域
作用域链
python中作用域链,变量会由内到外去找,先去自己的作用域找,自己没有在去上级去找,一直到找不到报错。
特性:
函数未执行之前,作用域已经形成,作用域链也生成了
name = "lzl" def f1():
print(name) def f2():
name = "eric"
f1()
f2()
这里有解释
#在f2中执行f1时,f1的作用域链已经形成,向上级找,name为lzl。
全局变量和局部变量
全局变量:所有函数之外定义的变量
局部变量:函数内部定义的变量 或者类,模块里的变量
全局变量和局部变量使用:
函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。
(即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。)
b = 2 def fun(): a = 1
b = 10
print locals()
print a
print b fun()
print globals() {'a': 1, 'b': 10}
1
10
{'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'find_namespce.py', '__package__': None, 'fun': <function fun at 0x7fb7bda1d668>, '__name__': '__main__', '__doc__': None}
局部变量如何使用全局变量:
[关键字 global]
#[demo1] Num = 100
def func():
global Num #声明这个Num是全局。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
Num = 200 #凡是在函数内部Num始终是指全局变量。这里不可能有个局部变量叫Num的。
print(Num ) func()
print(Num ) #输出200 说明修改的就是全局变量啊
#[demo2] def func():
global Num #声明这个Num是全局的哦。而且恰恰是此时没有一个全局变量是Num。那么如果全局没这个Num那就新定义一个Num的全局变量。
Num = 200
print(Num ) func()
print(Num ) #输出200 说明新定义了一个全局变量Num
如果不是明显要局部变量和全局变量互相操作能不纠缠就不纠缠。也就是定义变量名字的时候 要严格规范。按照开发规范来定义名字。全局大写或者加上“_”开头,这是避免不必要问题的根本消灭问题。如果实在是场景需求 局部要操作修改赋值全局变量。那就使用global。
python进阶之命名空间与作用域的更多相关文章
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- Python进阶(二)----函数参数,作用域
Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...
- python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)
一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...
- Python进阶 - 命名空间与作用域
Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...
- Python进阶-II 参数陷阱、命名空间、嵌套、作用域、闭包
一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_a ...
- 详解python命名空间和作用域
1.典型案例 先从几个典型的案例来看下名称空间及作用域对python代码运行的影响,请看下面几个代码实例及其执行结果,是否符合你的预期. 代码1:块作用域 if True: i = 1 print i ...
- Python学习日记day10------函数的命名空间、作用域与闭合函数
1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...
随机推荐
- PHP中查询指定时间范围内的所有日期,月份,季度,年份
/** * 查询指定时间范围内的所有日期,月份,季度,年份 * * @param $startDate 指定开始时间,Y-m-d格式 * @param $endDate 指定结束时间,Y-m-d格式 ...
- 自己实现LinkedList
public class MyLinkedList<E> { private Node first; private int size; public int size(){ return ...
- javaAPI操作Hbase
package chapter04; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configu ...
- Java8 Stream新特性详解及实战
Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...
- WPF中Expander的用法和控件模板详解
一.Expander的用法 在WPF中,Expander是一个很实用的复合控件,可以很方便的实现下拉菜单和导航栏等功能.先介绍简单的用法,而后分析他的控件模板. <Window.Resource ...
- 故事2:.net程序员成长经历
啊,最近一段时间在学习asp.net mvc ,一直没有接着写了,加上白天工作很忙,每天都很辛苦的哈,那咱接着说上一个故事哈. 当时第二天开始复习java面试题,非常的期待,从来没有去过公司,不知道别 ...
- 用python执行Linux命令
例1:在python中包装ls命令 #!/usr/bin/env python #python wapper for the ls command import subprocess subproce ...
- PHP通过session判断防止表单重复提交实例
PHP通过session判断防止表单重复提交实例,当用户提交表单后,为防止重复操作,通过session来判断是否为初次提交,否则让他返回到之前表单页面. 当前表单页面is_submit设为0 SESS ...
- Maven设置本地仓和阿里云远程仓
在maven项目导入jar包坐标时需要连接maven官方仓库下载,但是下载速度感人,所以来修改一下设置. 设置成为本地仓和连接阿里云的远程仓库. (本地仓如果没有这个jar) 找出相应配置文件:例如我 ...
- python web框架Django入门
Django 简介 背景及介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以 ...