python的命名空间
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间
重点是第四部分,我们将在此部分观察命名空间的内容。
一、命名空间
!!!不同命名空间中命名没有任何联系!!!
1 info = "Adress : "
2 def func_father(country):
3 def func_son(area):
4 city= "Shanghai " #此处的city变量,覆盖了父函数的city变量
5 print(info + country + city + area)
6 city = " Beijing "
7 #调用内部函数
8 func_son("ChaoYang ");
9
10 func_father("China ")
输出:Adress : China Shanghai ChaoYang
i=1
def func2():
i=i+1 func2();
#错误:UnboundLocalError: local variable 'i' referenced before assignment
由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。
# 1.只是取值:
i=1
def func():
print(i)
func()
print(i) # 2.赋值:
# i=1
# def func1():
# i+=1
# print(i)
#
# func1()
# print(i)
如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有gcount的定义和赋值,所以报错 # 3.申明全局变量:global
i=1
def func2():
global i
i+=1
print(i) func2()
print(i)
结论:在函数内部进行读值与赋值是不同的:
读值:变量按照查找顺序查找值,直到站到为止,找不到就报错,
赋值:赋值操作都是发生在函数的最内层空间,就是局部作用域,赋值只是将命名绑定到对象,这时候其实是看不到函数的外部变量的,只有加上 global 才能找到函数外面的变量。但读取就不需要。
四、命名空间的访问
def func1(i, str ):
x = 12345
print(locals()) func1(1 , "first")
输出:{'str': 'first', 'x': 12345, 'i': 1}
'''Created on 2013-5-26''' import copy
from copy import deepcopy gstr = "global string" def func1(i, info):
x = 12345
print(locals()) func1(1 , "first") if __name__ == "__main__":
print("the current scope's global variables:")
dictionary=globals()
print(dictionary)
输出:(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)

def func1(i, info):
x = 12345
print(locals())
locals()["x"]= 6789
print("x=",x) y=54321
func1(1 , "first")
globals()["y"]= 9876
print( "y=",y)

输出:
五、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
在Python 2.x中,闭包只能读外部函数的变量,而不能改写它。
python3中只要在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名了
def f1():
x=
def f2():
# nonlocal x
x+=
print(x) print(x)
return f2 f=f1()
f()
python的命名空间的更多相关文章
- Python进阶 - 命名空间与作用域
Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...
- 【Python】 命名空间与LEGB规则
命名空间与LEGB规则 之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样. ■ 命名空间 所 ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- Python Namespace - 命名空间
命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...
- 飘逸的python - 保持命名空间的整洁
API的设计是一个艺术活.往往需要其简单.易懂.整洁.不累赘. 很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的. 也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎 ...
- Python之命名空间、闭包、装饰器
一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...
- Python的命名空间及作用域
命名空间的分类 全局命名空间 是在程序从上到下被执行的过程中依次加载进内存的:放置了我们设置的所有变量名和函数名 局部命令空间 就是函数内部定义的名字:当调用函数的时候 才会产生这个名称空间 随着函数 ...
- Python函数——命名空间与闭包
前言 执行以下代码 def my_test(): x = 1 y = x+1 print(x) >> Traceback (most recent call last): File &qu ...
- Python 的命名空间
Python命名空间的本质: 一.命名空间的定义: 二.命名空间的查找顺序: 三.命名空间的生命周期: 四.通过locals()和globals() BIF访问命名空间. 重点是第四部分,我们将在此部 ...
随机推荐
- 【高斯消元】BZOJ3503 [Cqoi2014]和谐矩阵
3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1197 Solved: ...
- 【Unity与23种设计模式】迭代器模式(Iterator)
GoF中定义: "在不知道集合内部细节的情况下,提供一个按序方法存取一个对象集合体的每一个单元." 迭代器模式由于经常使用到 已经被现代程序设计语言纳为标准语句或收录到标准函数库中 ...
- IE 兼容 getElementsByClassName
getElementsByClassName 通过class获取节点,是很多新人练习原生JS都用到的,项目中也会写,当项目进行到一定程度时,测试IE低版本,忽然发现不支持的时候,瞬间感觉整个人都不好了 ...
- fail2ban防止SSH暴力破解
[root@kazihuo /srv]# wget https://github.com/fail2ban/fail2ban/archive/0.8.14.tar.gz [root@kazihuo / ...
- java--计时器
计时器 一.窗口化 public class Pro extends JFrame{ private JTextField textField = new JTextField(45);//系统时间文 ...
- Java 类文件结构
Java 诞生之时有句著名的宣传口号"Write Once, Run Anywhere.".但是,Java 语言本身不具备跨平台的能力,而是 JVM 提供了跨平台的能力. 事实上, ...
- 使用async和wait进行异步编程
本文来源于博客园-钱智慧,转载请注明出处 代码示例 // 要让一个方法成为异步方法: // - async修饰符. // - 返回类型是 Task 或者 Task<T>. 具体来说,如果函 ...
- python文件读read()、readline()、readlines()对比
读取文件的三个方法:read().readline().readlines().均可接受一个变量用以限制每次读取的数据量,但通常不使用.本章目的是分析和总结三种读取方式的使用方法和特点. 一.read ...
- 关于数据库的左,右,内,外连接,Union和Union all---------笔记
1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...
- 前端的UI设计与交互之数据录入篇
数据录入是获取对象信息的重要交互方式,用户会频繁的增加.修改或删除信息.多种多样的文本录入和选择录入方式帮助用户更加清晰和高效的完成这项体验.设计者应当注意这几点:为初级用户/偶尔访问的用户提供简单易 ...