名称空间

名称空间就是变量名与变量值绑定关系的地方。比如对于x=1,1存放于内存空间,而x与1的对应关系存储在名称空间中。

名称空间分为三类:内置名称空间、全局名称空间、局部名称空间。

内置名称空间

内置名称空间存储的是python解释器提前给我们定义好的,像len()、print()、open()等。

存活周期:python解释器运行则产生,关闭则销毁。

全局名称空间

名字只要不是在函数里的运行产生的,都会存到全局名称空间。

name = 'jason'  # 变量名name存入全局名称空间
def index(): # 函数名index存入全局名称空间
pass
if True:
a = 111 # 变量名a存入全局名称空间
for i in range(10): # 变量名i存入全局名称空间
pass
while True:
b = 222 # 变量名b存入全局名称空间

存活周期:python文件开始运行时产生,运行完毕时销毁。

局部名称空间

名字只要是在函数里的运行产生的,都会存到局部名称空间。

def index():
name = 'jason' # 变量名name存入局部名称空间

存活周期:函数被调用时产生,函数调用结束时销毁。

名称的查找顺序

如果要去找一个名称,有这么多个名称空间,我们该去那个名称空间找呢?

在查找名称之前,要先知道直接在哪一个空间内。知道了自己所在的空间后,先在自己空间内查找,找不到在向外寻找,所以查找顺序应该是:局部名称空间 >>> 全局名称空间 >>> 内置名称空间

# 案例一
len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print(len) # 输出:我是局部名称空间中的len
index() # 调用函数 函数体就会执行 就会产生局部名称空间
print(len) # 输出:我是全局名称空间中的len # 案例二
x = 111
def f1():
x = 222
def f2():
x = 333
print(x)
f2()
f1() # 输出:333

作用域

作用域就是名称空间能够作用的范围,按照名字作用范围的不同可以将三个名称空间划分为两个区域:

  • 全局作用域:全局存活,全局有效,内置名称空间和全局名称空间就是处于全局范围的。
  • 局部作用域:临时存活,局部有效,局部名称空间就是处于局部范围的。

global关键字

那么问题来了,我们该如何在局部内修改全局的名称的值呢?

如果全局名称空间中的名称是可变类型:

l = [1, 2, 3]
def index():
l.append(4)
index()
print(l) # 输出:[1, 2, 3, 4]

如果全局名称空间中的名称是不可变类型:

x = 100
def index():
global x # 使用关键字声明,说明之后的x使用的是全局的x
x = 200
index()
print(x) # 输出:200 """如果想要在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字global申明"""

nonlocal关键字

问题又来了,知道了怎么在局部名称空间中修改全局名称空间中的名字,那么局部名称空间有多层嵌套该如何修改外层的名字呢?

比如:

def index():
x = 100
def f():
# 如何在f()函数里修改x的值?
f()
print(x)

同样,这个时候也是需要一个关键字,这个关键字就是nonlocal。

def index():
x = 100
def f():
nonlocal x # 使用nonlocal关键字,说明之后的x使用的是外层的x
x = 200
f()
print(x) # 输出:200

函数名的多种用法

用法一:函数名当做变量名赋值

def index():
print('来自函数index')
res = index # 让res也指向index指向的函数体代码
res() # 相当于执行了index()
# 输出:来自函数index

用法二:函数名当函数的实参

def index():
print('来自函数index')
def func(a):
a()
func(index) # 实参index传给形参a,func函数内部的a()变成了index()
# 输出:来自函数index

用法三:函数名当做函数的返回值

def func():
return index # 将函数名当做返回值
def index():
print('来自函数index')
res = func() # res接收函数名index
res() # 相当于执行了index()
# 输出:来自函数index

用法4:函数名作为容器类型的元素

def index():
print('来自函数index')
l1 = [1, 2, 3, index]
l1[-1]() # 相当于执行了index()
# 输出:来自函数index

函数的嵌套

函数的嵌套其实就与if、while、for循环的嵌套一样,这里只做简单展示。

# 函数嵌套死循环
def index():
func()
print('来自index')
def func():
index()
print('来自func')
func()

python之名称空间与函数对象的更多相关文章

  1. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

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

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

  3. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  4. day 23 对象的名称空间 类,对象属性和方法 封装 接口提供

    一.对象的特有名称空间 # 对象独有的名称空间:在产生对象时就赋初值 '''class ted: def func(): 当func里不存在参数时,调用时不需要给值 print('hah')ted.f ...

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

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

  6. python之名称空间

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

  7. Python基础—名称空间(Day10)

    一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...

  8. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  9. python基础之函数参数,名称空间,以及函数嵌套

    函数进阶内容梗概: 1. 函数参数--动态传参 2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序. 3. 函数的嵌套 4. gloabal , nonlocal 关键字 1. 函 ...

随机推荐

  1. Linux环境下Eclipse中快捷键不起作用

    在window->Preferences->general->keys中, 找到 content asist 修改下边值 Binding 改成 Alt+/ When 改为 Editi ...

  2. C语言---魔方阵

    魔方阵的定义:在n*n的方阵中,每一行的和=每一列的和=对角线的和.(本文中涉及的n为大于3的奇数). 例如3*3的魔方阵为: 5*5的魔方阵为: 如何写魔方阵呢? 1.数字1位于第一行的正中间2.下 ...

  3. 基于Apache组件,分析对象池原理

    池塘里养:Object: 一.设计与原理 1.基础案例 首先看一个基于common-pool2对象池组件的应用案例,主要有工厂类.对象池.对象三个核心角色,以及池化对象的使用流程: import or ...

  4. Struts2中将表单数据封装到List和Map集合中

    一.将表单数据封装到Map集合中 1.创建MapAction类 import cn.entity.User; import com.opensymphony.xwork2.ActionSupport; ...

  5. Map的key是否可重复

    我们都知道Map的一大特性是key唯一不可重复,可是真的是这样的吗? 我们来试验一下: 运行结果: 我们可以看到在map里有两个同样的person作为key,打破了map的key不可重复的特性. 我们 ...

  6. Java语言学习day29--8月04日

    今日内容介绍1.Object2.String3.StringBuilder ###01API概念 * A:API(Application Programming Interface) * 应用程序编程 ...

  7. 2021.08.06 P2441 角色属性树(树形结构)

    2021.08.06 P2441 角色属性树(树形结构) P2441 角色属性树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求离x最近的祖先y且(x,y)>1. ...

  8. WebSocket 协议详解

    一.WebSocket 协议背景 早期,在网站上推送消息给用户,只能通过轮询的方式或 Comet 技术.轮询就是浏览器每隔几秒钟向服务端发送 HTTP 请求,然后服务端返回消息给客户端. 轮询技术一般 ...

  9. 硬件开发笔记(一):高速电路设计Cadence Aleego软件介绍和安装过程

    前言   红胖子软硬通吃的前提的使用AD,涉及到高速电路板,要配合高速硬件工程师,使用Aleegro更合适,遂开启了Aleegro设计电路板学习,过程保存为开发笔记,旨在普及和沟通技术,共同进步,学无 ...

  10. jmeter工具初探

    jmeter工具初探 一.jmeter工具介绍 1.一种免费的java开源工具,可以进行二次开发 2.运行环境:java运行环境,需要安装JDK,配置JAVAHOME 环境变量 3.下载jmeter: ...