一、名称空间和作用域

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. GoWeb之gin框架

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 一.快速上手 安装 go mod init go get -u ...

  2. js对象方法

    Number对象方法 toFixed() 方法 toFixed()方法返回的是具有指定位数小数的数字的字符串表示.例如: var oNumberObject = new Number(68); ale ...

  3. kali linux2020 虚拟机改root密码

    kali在2020版的更新中,好多小伙伴登不进root账号,这里来教大家怎样改root账户的密码 1.当我们打开虚拟机看到这个界面的时候,按e进入编辑模式 2.在编辑模式中,"quite s ...

  4. Java反射详解:入门+使用+原理+应用场景

    反射非常强大和有用,现在市面上绝大部分框架(spring.mybatis.rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用. 所以,在你Java进阶的道路上,你需要掌握好 ...

  5. Java加减乘除计算器实现

    加减乘除计算机的实现 public static void main(String[] args) { while(true) { System.out.println("依次输入要计算的2 ...

  6. [USB波形分析] 全速USB波形数据分析(一)

    在之前的文章一次CAN波形分析之旅里,根据示波器采集的波形数据,详细地分析了CAN通信.今天来分析USB数据,还是同样的流程,但是这次使用matplotlib来协助分析. USB基本波形 USB通过一 ...

  7. 【刷题-LeetCode】150 Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  8. echarts x轴的纵向区域随便点击获取点击的x轴那一纵向区域的值

    1.现在xAxis里面配置一下: 2.在生成图表的后面加入框起来的部分 myChart.getZr().on('click', function (params) { /* 通过获取echarts上面 ...

  9. Spring Boot Starter 和 ABP Module

    Spring Boot 和 ABP 都是模块化的系统,分别是Java 和.NET 可以对比的框架.模块系统是就像乐高玩具一样,一块一块零散积木堆积起一个精彩的世界.每种积木的形状各不相同,功能各不相同 ...

  10. 不难懂------react---Immutable的基本使用

    一.Immutable简介 Immutable Data 就是一旦创建,就不能再被更改的数据.对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象.Immut ...