名称空间

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. if else 选择机构 _多重if选择机构_if选择结构嵌套(综合练习题——code)

    import java.util.*; class If01{ public static void main(String[ ]args){ //练习1:假如张三参加Java考试,判断如果在95分以 ...

  2. HTML学习之基础

    HTML是网页的标记语言不是编程语言,有一些标记段组成.大小写不敏感,可以用常用的编辑器软件编写用浏览器打开即可 有不同的版本<!DOCTYPE html> <meta charse ...

  3. [转] js 实现table每列可左右拖动改变列宽度

    <!DOCTYPE HTML>   <html>   <head>   <meta charset="gbk">   <tit ...

  4. 在rails 中使用mysql 出现Mysql::Error: Incorrect string value: 的问题

    这是因为你在做数据库的操作中有非英文的问题,之后gem mysql2 处理中文必须要数据库也指定是utf-8 才比较好处理 解决的方法很简单,将数据库每张表都转化成utf-8即可,如果数据库没有什么重 ...

  5. Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)

    Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ...

  6. TouchSlide 触屏滑动特效插件

    TouchSlide 是纯javascript打造的触屏滑动特效插件,面向手机.平板电脑等移动终端,能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. 插件开源.体积小.简单实用.功能强大,是 ...

  7. matlab 摘要

    matlab中的向量与矩阵 如果定义一个A = [1, 2, 3]; 则A为一个行向量 但是A(:)返回的是一个列向量 关于函数的返回值 在function [a, b, c] = fit_quadr ...

  8. c#操作excel的一些记录

    //开启Excel APP            Excel.Application xlApp = new Excel.Application(); //获取程序下bin—>debug下的文件 ...

  9. PHP+phpMyAdmin编程插入数据显示中文乱码的问题

    相信初学php的同学应该都会试一些小程序,比如从input文本框输入数据后点击提交,数据自动插入数据库保存. 但是如果是输入中文提交,不经过一定配置,在phpMyAdmin中就会显示乱码.什么%ez. ...

  10. aliyun maven repository

    <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> & ...