一、名称空间和作用域

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. Hadoop的Shuffle阶段

    原文: https://www.toutiao.com/i6764683672772674062/ 在进入Map之前,首先会将数据从HDFS中读取,进行处理,按照字节偏移量这种之前说的形式处理为K,V ...

  2. leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II

    83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...

  3. TexStudio中Bibtex使用

    TexStudio中Bibtex使用 1.首先在百度文库中找到相应的参考文献: 2.建立bibfile.bib文件,放在和.tex同一目录下,将上面页面的结果考入该文件,注意其中第一行中的Tuan20 ...

  4. 微信小程序云开发框架

    概述 一直做后端服务器开发,最近看了一篇文章介绍小程序的云开发模式,觉得挺有意思,就尝试了一下,由本文做个记录. 因为不是专业的小程序开发人员,也没有做过网页开发,所以论述中出现错误难以避免,请多谅解 ...

  5. macos下命令行通过ndk编译android下可以执行的ELF程序(并验证opencl的调用)

    源码如下,实现把一个JPG保存成灰度图格式的BMP 1 //jpg2bmp.cpp 2 #include <stdio.h> 3 #include <inttypes.h> 4 ...

  6. deepin20体验

    现在Ubuntu20吊打deepin20 100条街.撑了20天受不了deepin 优点 开机启动设置简单,即使不是应用商店的应用也很好 deepin仓库不用代理也很快.,而且有些Ubuntu下载不了 ...

  7. 「DP 浅析」斜率优化

    #0.0 屑在前面 将结合经典例题 「HNOI2008」玩具装箱 以及 「NOI2007」货币兑换 进行讲解. #1.0 简述 #1.1 适用情况 斜率优化一般适用于状态转移方程如下的 DP \[f_ ...

  8. 嵌入式硬件之ADC/DAC

    嵌入式硬件之ADC/DAC 写在前面 这几天在做一个寒假练项目,其中涉及到了音频的处理,ADC.DAC再次进入到了我的视野,并引起了我新的思考. 1.初次相识 记得去年七月份,本科毕业刚离校,就到研究 ...

  9. java-异常-编译时检测异常和运行时异常区别(throws和throw区别)

    1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常 ...

  10. fluentd分布式日志管理系统

    如何有效地收集和管理大量服务器的日志一直是企业很头疼的一个问题,部分企业应用shell脚本来管理,部分企业基于hadoop来开发自己的日志管理系统,第一种管理成本巨大,需要大量的人力来维护脚本的正常运 ...