一、名称空间和作用域

1.全局名称空间(名称空间、命名空间):

py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称空间里找变量与对应值的内存地址,通过内存地址找到对应的值。

2.局部名称空间(临时名称空间):

函数名放在内存地址里,当执行函数时,会在内存中开辟一个临时名称空间 ,存放函数体内的所有变量与值的关系。随着函数的执行完毕,临时空间自动关闭。

3.内置名称空间:所有的内置函数等存储的空间。

加载顺序:内置名称空间---->全局名称空间---->(函数执行时)局部名称空间

取值顺序:(函数执行时)局部名称空间--->全局名称空间---->内置名称空间

4.全局作用域:包含全局名称空间,内置名称空间,在整个文件的任意位置都能被引用,全局有效。

局部作用域:局部名称空间,只在局部范围内有效。

5.内置函数

globals:将全局名称空间的所有变量放在一个字典里。

lacals:将局部名称空间里的变量放在一个字典里。

6.关键字

global作用:

1)在局部名称空间内声明一个全局变量。

def func1():
global name
name='老男孩'
print(name)
func1()
print(name) 执行结果:
老男孩
老男孩

2)在局部名称空间内改变一个全局变量。

name='wusir'
def func1():
global name
name='老男孩'
print(name)
func1()
print(name) 执行结果:
老男孩
老男孩

nonlocal(python2中没有):

1.不能修改全局作用域。

a=4
def func1():
nonlocal a
a=5
print(a)
func1()
print(a) 报错#a是全局

2.在局部作用域中,对父级作用域(后者更外层的作用域非全局作用域)的变量进行引用和修改,并且引用的哪层从哪层及以下的变量全部发生改变。

a=4
def func1():
b=6
def func2():
nonlocal b #从这层起对b进行修改
b=666
print(b)
func2()
print(b)
func1() 执行结果:
666
666

二、函数的嵌套

函数调用时执行

代码从上至下依次执行,调用函数时函数里面从上之下依次执行

def f1():
print('in f1')
def f2():
print('in f2')
f2()
f1() 执行结果:
in f1
in f2
def f1():  #print('in f3')
def f2(): #print('in f1')
def f3(): #print('in f2')
print('in f3')
print('in f2')
f3()
print('in f1')
f2()
f1()
执行结果:
in f1
in f2
in f3

三、函数名的本质

函数名是函数的名字,本质是变量(特殊的变量),函数名()表示执行此函数。

1.单独打印函数名返回函数的地址。

def func1():
print(666)
print(func1) 执行结果:
<function func1 at 0x000000D735492400>

2.函数名的赋值。

def func2():
print(666)
f=func2
print(f()) 执行结果:
666
None

3.函数名可以作为容器类数据的元素。

def f1():
print(11)
def f2():
print(22)
def f3():
print(33) l1=[f1,f2,f3]
for i in l1:
i() l1=[]
for i in range(1,4):
l1.append('f'+str(i))
print(l1) for i in l1:
eval(i)()

4.函数名可以作为参数。

a=1
def f1(x):
print(x)
f1(a) 执行结果:
1

5.函数名可以作为函数的返回值。

def f11(x):
return x
ret=f11(5)
print(ret) 执行结果:
5

四、闭包

闭包就是内层函数对外层函数(非全局)变量的引用。

def wraaper1():
name='guo'
def inner():
print(name)
inner()
print(inner.__closure__)
wraaper1() 执行结果:
guo
(<cell at 0x00000073DFFA7228: str object at 0x00000073DFF8CDF8>,)

当函数开始执行时,如果遇到了闭包,它有一个机制,它会永远开辟一个内存空间,将闭包中的变量等值放在其中,不会随着函数的执行完毕而消失。

name='老男孩'
def wraaper2(n):
def inner():
print(n)
inner()
print(inner.__closure__)
wraaper2(name) 执行结果:
老男孩
(<cell at 0x0000007DC1777228: str object at 0x0000007DC1773260>,)

Python基础—名称空间(Day10)的更多相关文章

  1. python函数名称空间

    一.命名空间概念 命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方.命名空间分三种: locals:函数内的名称空间,包括局部变量和形参 gl ...

  2. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  3. python之名称空间

    1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类的数据属性是共享给所有对象 print(id(g1.c ...

  4. Python(名称空间、函数嵌套、函数对象)

    一.名称空间: 名称空间 定义:存放名字和值的绑定关系       内置名称空间 python自带的名字,如print.int.str 解释器启动就会生效   全局名称空间 文件级别定义的名字,都会放 ...

  5. python函数名称空间与作用域、闭包

    一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...

  6. python函数----名称空间和作用域

    一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方. 对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系. ​在程序执行 ...

  7. python之名称空间与函数对象

    目录 名称空间 内置名称空间 全局名称空间 局部名称空间 名称的查找顺序 作用域 global关键字 nonlocal关键字 函数名的多种用法 函数的嵌套 名称空间 名称空间就是变量名与变量值绑定关系 ...

  8. Python 名称空间与作用域、闭包与装饰器

    Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...

  9. python名称空间介绍

    python名称空间介绍 名称空间 python 中名称空间分三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间: 原码里面的一些函数都是存在这个内存空间中,任何模块均可访问它,它存放着内 ...

随机推荐

  1. HDURomantic

    Problem - 1004 (hdu.edu.cn) 扩展欧几里得解决线性同余方程.先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解.另一个可以通过相减,或者一样的 ...

  2. .Net 线程安全集合

    .Net 提供了基于生产-消费模式的集合类,这些集合对多线程访问安全,定义在System.Collections.Concurrent名称空间中.这个名称空间中包括基础接口IProduceConsum ...

  3. 第51篇-SharedRuntime::generate_native_wrapper()生成编译入口

    当某个native方法被调用时,一开始它会从解释入口进入,也就是我之前介绍的.由InterpreterGenerator::generate_native_entry()函数生成的入口例程.在这个例程 ...

  4. Flowable实战(四)BPMN2.0 启动与结束事件

    一.BPMN2.0   BPMN2.0规范是一个标准,开源框架和不同供应商都遵循这份标准,使得最终用户不会因为依赖专有解决方案,而被供应商"绑架".有了BPMN2.0标准,不同解决 ...

  5. RHCSA 第三天

    1.将echo "This is my first time to use pipe"内容输出到屏幕上,且保存到pipe_data.txt中 2. 重定向: a.新建一个文件red ...

  6. JavaScript中数字常用方法

    数字常用方法 (1)返回0-1(不包含1)随机小数(random()) 格式:Math.random() var num=parseInt(Math.random()*11) //拿到0-10中的随机 ...

  7. Android 12(S) 图形显示系统 - 基本概念(一)

    1 前言 Android图形系统是系统框架中一个非常重要的子系统,与其它子系统一样,Android 框架提供了各种用于 2D 和 3D 图形渲染的 API供开发者使用来创建绚丽多彩的应用APP.图形渲 ...

  8. C#检测外部exe程序弹窗错误,并重启

    private void button2_Click(object sender, EventArgs e) { string mainTitle = System.Configuration.Con ...

  9. MongDB日志分析

    Result文件数据说明: Ip:106.39.41.166,(城市) Date:10/Nov/2016:00:01:02 +0800,(日期) Day:10,(天数) Traffic: 54 ,(流 ...

  10. 【get√】发现一个redis zset的新玩法:用ZINTERSTORE把value都置0

    直接上指令: redis-cli -h 192.168.0.5 -p 6379 -a test123 DEL __temp_ahfu1 ZADD __temp_ahfu1 1 0.0.18.185_0 ...