名称空间

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实际上是同一个 !

python—命名空间、作用域查找顺序、闭包的更多相关文章

  1. python学习三十七天函数的作用域查找顺序LEGB

    python函数的作用域查找顺序LEGB,分别为 locals  eclosing  globals  builtins .了解作用域的范围,可以更好的操作你想要的业务,分别介绍一下. 1,local ...

  2. [Python] 命名空间&作用域

    Python的类语句不会创建实例 类会创建命名空间,通过对象访问类的属性和方法 类不会创建作用域,对方法和属性的引用必须加以限定(如在方法中必须通过self引用实例的属性) class My1(): ...

  3. Python属性的查找顺序

    属性查找顺序 关于属性描述符请看上文>属性描述符   在梳理属性查找相关知识时,查看了很多的书籍和他人的博客,发现很多讲的过于抽象,并没有一个清晰的流程呈现.特此写下我对于此方面的理解和总结. ...

  4. el表达式作用域查找顺序 注意:当属性名字相同时候 先找到是小的作用域 因为是从小到大开始找的

  5. python函数对象-命名空间-作用域-02

    函数对象 函数是第一对象: # 函数名指向的值可以被当做参数传递 函数对象的特性(*****灵活运用,后面讲装饰器会用到) 函数名可以像变量一样被传递 # 变量可以被传递 name = 'jason' ...

  6. python命名空间的本质

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...

  7. python基础(7)-函数&命名空间&作用域&闭包

    函数 动态参数 *args def sum(*args): ''' 任何参数都会被args以元组的方式接收 ''' print(type(args)) # result:<class 'tupl ...

  8. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  9. python命名空间、作用域、闭包与传值传引用

    (以下内容,均基于python3) 最近在看python函数部分,讲到了python的作用域问题,然后又讲了Python的闭包问题. 在做作业的时候,我遇到了几个问题,下面先来看作业. 一. 作业1: ...

随机推荐

  1. ES6结构赋值

    解构赋值 从ES6开始,JavaScript引入了解构赋值,可以同时对一组变量进行赋值. 什么是解构赋值?我们先看看传统的做法,如何把一个数组的元素分别赋值给几个变量: var array = ['h ...

  2. http 协议的简单学习 虽然有点老但是 还不错

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  3. ajax动态给select赋值

    <select name="elements" id="ele" style="width: 145px;">          ...

  4. Unity Collab

    window-services下面打开面板,这里有开关(或者你也可以进入后台项目管理页面删除项目). 最大的圈是项目名称. 然后就打开了下面页面,关上就可以了.

  5. ubuntu安装软件依赖解决

    sudo apt-get install -f zsh@zsh:~/Downloads/dist$ sudo dpkg --install Kitematic_0.17.3_amd64.deb (正在 ...

  6. Huawei English Corner

     Keywords  Descriptions  FWIW  For what it's worth(不管结果怎样)  ASAP  As Soon As Possible(尽快)  FYI  For ...

  7. git跟svn 服务端对比

    Git已经火了很久,简单的使用也没有问题,但有几个问题一直以来都没有搞清楚:git跟svn有哪些异同,两者相互的优劣是什么,git的分布式怎么理解,为什么有离线提交,,,自己动手,分别看一下服务端跟客 ...

  8. POJ 3522 ——Slim Span——————【最小生成树、最大边与最小边最小】

    Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7102   Accepted: 3761 Descrip ...

  9. 初步学习XML的基本代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. python面试题——基础篇(80题)

    1.为什么学习Python? Python是一门优秀的综合语言, Python的宗旨是简明.优雅.强大,在人工智能.云计算.金融分析.大数据开发.WEB开发.自动化运维.测试等方向应用广泛 2.通过什 ...