函数作用域                                                                                                                                                                   

 命名空间:

从python解释器开始执行之后,就在内存中开辟了一个空间,每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间

代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

命名空间的本质: 存放变量名和值的绑定关系。

命名空间种类:全局名名空间,局部命名空间,内置命明空间

* 内置明明空间中保存的python内置方法的绑定关系。

命名空间的取值顺序 : 局部命明空间----全局命名空间------内置命名空间

作用域:

作用域时按范围分的,分为全局作用域和局部作用域,全局作用域中的变量叫全局变量,局部作用域中的叫局部变量。 全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效 局部作用域:局部名称空间,只能在局部范围内生效 查看全局变量和局部变量的方法分别是globals 和 locals。 在局部如果可以直接引用全局变量,如果想要修改就需要用到 global 关键字
name = "Alex"      # 定义一个全局变量name
def user():
global name # 引用全局变量name
name = "alex" # 给全局变量name重新赋值
print(name) user()
print(name) # 这里打印出来的就是更改后的name

函数嵌套:

在函数的内部又声明了另一个函数,就叫函数的嵌套。

def f1():
a = 5
print(a) # 函数f1定义了一个变量a,所以会从自己内部找a的值 def f2():
print(a) # 函数f2并未定义变量a,所以回去上一级f1中去找变量a的值 def f3():
a = 6
print(a) # 函数f3中定义了变量a,所以会输出自身中定义的a的值,函数内部的变量是独立的,所以并不会改变上级函数中a的值 f3()
f2() f1()

如果想要改变外部函数的中的变量a的值,需要用到关键字 nonlocal
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1():
a = 3
def f2():
nonlocal a
a = 2
f2()
print(a)
f1()

闭包:

当一个内部函数引用了他外部函数中的变量,并在外部函数中被调用时就会形成闭包。
一般我们这样使用闭包:
def ouder():
name = "Alex" def inner():
print(name)
return inner # 这里时ouder函数的返回值 f = ouder() # f拿到的时ouder函数的返回值inner
f() # 这里f()就相当于inner()

判断闭包的方法 __closure__ , 根据打印的结果中是否以cell元素开头判定函数是不是闭包。
def ouder():
name = "Alex" def inner():
print(name)
print(inner.__closure__) return inner # 这里时ouder函数的返回值 f = ouder() # f拿到的时ouder函数的返回值inner
f() # 这里f()就相当于inner()


python函数作用域,嵌套函数,闭包的更多相关文章

  1. 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!

    Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...

  2. Python基础--函数的嵌套和闭包

    一.名称空间和作用域 名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名 1.内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域 2.全局名 ...

  3. python函数调用顺序、高阶函数、嵌套函数、闭包详解

    一:函数调用顺序:其他高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用错误示范: def foo(): print 'in the foo' bar() foo() 报错: i ...

  4. day4_python之名称空间与作用域、闭包函数、嵌套函数

    一.名称空间与作用域 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件 ...

  5. Python中函数的嵌套及闭包

    函数的嵌套 调用:在函数中调用函数 定义:在函数中定义函数 地址:函数名有内存地址,内存地址可赋值 示例 a = 1 def outer(): a = 1 def inner(): a = 2 def ...

  6. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  7. Python 变量作用域与函数

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  8. day12 函数的嵌套调用 闭包函数,函数对象

    函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...

  9. 深入理解JS函数作用域链与闭包问题

    function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...

  10. python之6-3嵌套函数

    1. 嵌套函数 子函数可以继承父函数的变量 父函数返回子函数 子函数返回结果 看例子如下:结果是一个字符串fun1+fun2 #!/usr/bin/env python # coding=utf-8 ...

随机推荐

  1. converting the moment tensor to strie-dip-rake

    在多断层求解的试验中,用到了六个基本矩张量: 而显然,尚不能从图中直接读出strke,dip,rake的值,但有关资料给出了这六个基本矩张量的momet tensor: 而找到一个网站可以方便地将mo ...

  2. 数据库行转列、列转行,pivot透视多列

    这就是典型的行转列问题. 首先说下最简单的思路  用union all select year,sum(m1) m1,sum(m2) m2,sum(m3) m3,sum(m4) m4 from ( s ...

  3. 剑指Offer 57. 二叉树的下一个结点 (二叉树)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...

  4. hdu4612 Warm up 缩点+树的直径

    题意抽象后为:给定一个无向图 问添加一条边的情况下最少能有多少个桥. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(2<=N<=200000),边数M(1<=M< ...

  5. Linux下常用工具

    GUI篇 计算器gnome-calculator pdf阅读envince 虚拟机virtualbox vnc tigervnc-server and client 网络连接network-manag ...

  6. python学习之路04——列表和字典

    列表和字典 python中的可变数据类型有:列表和字典 不可变类型:数字,字符串,元组 今天先讲列表和字典 一.列表 1.概念: 变量:使用变量存储数据,但是,变量存储数据每次只能存储一个数据 问题: ...

  7. 学习笔记TF040:多GPU并行

    TensorFlow并行,模型并行,数据并行.模型并行根据不同模型设计不同并行方式,模型不同计算节点放在不同硬伯上资源运算.数据并行,比较通用简便实现大规模并行方式,同时使用多个硬件资源计算不同bat ...

  8. 批量将某一目录下的.py文件改为.txt格式文件

    #!/usr/env/python#-*- coding:utf-8 -*-#批量将某一目录下的.py文件改为.txt格式文件import os,os.pathfile_list = os.listd ...

  9. Go Example--自定义排序

    package main import ( "fmt" "sort" ) //定义类型别名 type ByLength []string func (s ByL ...

  10. PythonStudy——字典的定义 Dictionary definition

    # 空字典 d1 = {} d2 = dict() # 用map映射创建字典 d3 = dict({'a': 1, 'b': 1}) print(d3) # 用关键字赋值方式 d4 = dict(na ...