名称空间

name space,如下图:

x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址,

名称空间是存放了变量x与1绑定关系的地方

名称空间共3种 :

  • locals: 是函数内的名称空间,包括局部变量和形参。
  • globals: 全局变量,函数定义所在模块的名字空间。全局存活,全局有效
  • builtins: 内置模块的名字空间

不同变量的作用域不同就是由这个变量所在的命名空间决定的。

查看作用域方法 globals(),locals()


作用域查找顺序

level = 'L0'
n = 22
def func():
level = 'L1'
n = 33
print('func',locals()) def outer():
n = 44
level = 'L2'
print('outer',locals(),n) def inner():
level = 'L3'
print('inner',locals(),n) #此外打印的n是多少?
inner()
outer() func()
# 打印:
# func {'n': 33, 'level': 'L1'}
# outer {'level': 'L2', 'n': 44} 44
# inner {'level': 'L3', 'n': 44} 44

变量查找顺序:

LEGB : locals -> enclosing function -> globals -> builtins

  • locals 是函数内的名字空间,包括局部变量和形参
  • enclosing 外部嵌套函数的名字空间
  • globals 全局变量,函数定义所在模块的名字空间
  • builtins 内置模块的名字空间

python中的闭包

def func():
n = 10 def func2():
print('func2:',n)
return func2 f = func()
f() #func2: 10
外部函数func 里定义一个 内部函数func2,我们直接在外面是不能调用内部函数的。
但是现在外部函数把 内部函数给返回了,相当于我们在外面拿到了内部函数 func2.
总结一下:我们在外部可以执行func内部的函数,并且还可以用他内部函数作用域里面的变量值, 这个现象就是闭包

(关于闭包的学习,以下内容我参考了:https://www.cnblogs.com/Lin-Yi/p/7305364.html 的博客,先把这篇博客地址在这儿存一下。)

一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量

#coding:utf8
def outer(x):
def inner(y):
nonlocal x
x+=y
return x
return inner a = outer(10)
print(a(1)) //11
print(a(3)) //14

两次分别打印出11和14,由此可见,每次调用inner的时候,使用的闭包变量x实际上是同一个 !

最新文章

  1. UISegmentedControl 的使用
  2. frp内网穿透配置
  3. cocos2d-x渲染流程
  4. MAC地址泛洪攻击测试
  5. STL源码--Allocator学习
  6. IIS6.0文件解析漏洞小结
  7. 【CSS3】---块状元素、内联元素(又叫行内元素)和内联块状元素
  8. printf left justify
  9. 关于this
  10. LNMP wget 记录
  11. ASP.NET-FineUI开发实践-13(二)
  12. CSS 之 margin知识点
  13. 禁用谷歌字体解决WordPress访问速度过慢问题
  14. 一个简单java爬虫爬取网页中邮箱并保存
  15. PROTEL99生成GERBER的操作说明
  16. 【剑指offer】删除字符也出现在一个字符串
  17. HDU - 5186 - zhx's submissions (精密塔尔苏斯)
  18. asp.net学习之 数据绑定控件--表格绑定控件
  19. 兄弟连PHP培训教你提升效率的20个要点
  20. 4.26 IO流

热门文章

  1. Robot Framework自动化测试(一)
  2. JavaSE---线程同步
  3. B P5 第十三届北航程序设计竞赛预赛
  4. Unity Input.GetMouseButtonDown 拿到鼠标按键
  5. Linux 启动盘命令
  6. Myeclipse修改jdk版本流程
  7. SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录
  8. MySQL中的information_schema
  9. Spring的注解积累
  10. Wallet address