python之函数名称空间,作用域,嵌套函数
嵌套函数
定义
函数内部定义的函数,无法在函数外部使用内部定义的函数。
def f1():
def f2():
print('from f2')
f2()
f2() # NameError: name 'f2' is not defined
def f1():
def f2():
print('from f2')
f2()
f1()
'''
from f2
'''
名称空间的三大类(只存变量名)
内置名称空间
- 定义:python解释器自带的方法,如:int,float,len等。类似小整数池
- 生命周期:在python解释器启动时,就开始生效。直到python解释器关闭
全局名称空间
定义:除了内置和局部的名字之外,其余都存在全局名称空间。如下面的代码
x,func,zx = 1 def func():
pass if x > 11:
z = 20000
else:
z = 555
print(z)生命周期:在文件执行时生效,文件执行完后失效
局部名称空间
定义:在函数内部的都叫局部,也就是说在函数内部定义的变量 就是局部变量。如下图的
x,f2等等def test_one():
x = 1
def max_num():
print("from max_num")
max_num() test_one()
生命周期:在调用函数时生效,当函数执行结束后失效
名称空间加载顺序
内置名称空间 --> 全局名称空间 --> 局部名称空间
变量名的查找顺序为
局部名称空间 --> 全局名称空间 --> 内置名称空间
作用域
全局作用域
定义:全局有效,全局存活,包含内置名称空间和全局名称空间.如
x,test_onex = 1 def test_one():
print(x) test_one()
局部作用域
定义:局部有效,临时存储,只包含局部名称空间。如
xdef test_one()
x = 1
print(x) test_one()
PS:当局部名称空间没有对应的变量时,系统会自动去
全局名称空间查找。没有找到就会报错。# 第一种情况
x = 1
def one():
print(x) def two():
x = 10
one()
two() '''
1
''' # 第二种情况
x = 1
def one():
x = 10
print(x) def two():
x = 5
one() two() '''
10
''' '''
总结:
对于第一种情况,程序调用了two函数,在two函数中调用了one函数,而one函数中没有定义x变量,对于one函数而言,它属于局部名称空间,变量x既然没有定义,那么就直接去上一级找,因此x=1
对于第二种情况,one函数中定义了x变量,因此直接使用即可,所以x=10 '''
函数对象+作用域应用
补充知识点
global关键字:修改全局作用域中的变量
x = 1 def f1():
x = 2 def f2():
# global x # 修改全局
x = 3
f2() f1()
print(x) '''
1
''' x = 1 def f1():
x = 2 def f2():
global x # 修改全局
x = 3
f2() f1()
print(x) '''
3
'''
nonlocal关键字
x = 1 def f1():
x = 2 def f2():
# nonlocal x
x = 3 f2()
print(x) f1() '''
2
''' x = 1 def f1():
x = 2 def f2():
nonlocal x
x = 3 f2()
print(x) f1() '''
3
'''
注意
在局部名称空间中想要修改全局的可变类型,不需要任何声明,可以直接修改
lis = [] def f1():
lis.append(1) print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")
在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改
python之函数名称空间,作用域,嵌套函数的更多相关文章
- Python记录9:函数4:名称空间作用域+闭包函数+装饰器
''' 一: 名称空间namespaces 名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种 内置名称空间: 1. 特点: 存放是python解释器自 ...
- Day11名称空间,作用域,闭包函数
Day11 1.函数对象: ①可以被引用 ②可以作为另一个函数的参数 ③可以作为另一个函数的返回值0 ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ...
- Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数
本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...
- python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套
复习 1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用: # 字符串的比较# -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...
- 《Python》 函数进阶和名称空间作用域
函数进阶: 一.动态参数:*args **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...
- day 12 名称空间和闭包函数
函数嵌套 按照函数的两个阶段分为: 嵌套调用:在一个函数内部调用另一个函数 嵌套定义:在一个函数内部定义另一个函数 名称空间(namespace):存储名字的内存区域 名称空间的分类: 内置名称空间: ...
- python基础——类名称空间与对象(实例)名称空间
python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...
- 【php 之根据函数名称动态调用该函数】
解释函数:call_user_func()以及函数call_user_func_array() 对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交 ...
- Python 类的名称空间和组合
一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...
随机推荐
- Numpy Pandas
数据分析 : 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律. 数据分析三剑客 - Numpy Pandas Matplotlib # Numpy 基于一维或多维的数 ...
- HDU 1241 Oil Deposits(经典DFS)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 很经典的一道dfs,但是注意每次查到一个@之后,都要把它变成“ * ”,然后继续dfs ...
- mybatis实现有则更新无则插入
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" ke ...
- C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,
//学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...
- vs2017 vs2019配置sqlite3连接引擎(驱动)指南(二)vs2019续集
在写完上一篇博客后,一觉醒来,又又又又不行了,介绍一个终极大招,如果你的fuck vs又提示无法打开sqlite3.h的问题 环境win10 vs2019 debug x86 实在没心情写文字了,直 ...
- [蓝桥杯2017初赛]k倍区间 前缀和
题目描述 给定一个长度为N的数列,A1, A2, ... AN. 如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 有个网站秒破mdb访问密码
http://tools.bugscaner.com/crackmdb/网站
- Edge Beta Android版更新已启用新图标
导读 微软Edge Beta Android版更新已启用新图标设计 IT之家消息 适用于Android的Microsoft Edge Beta已于近日获得更新,最显著的特征就是使用了新图标设计.该图标 ...
- [WC2018]州区划分(状压,子集卷积)
[洛谷题面]https://www.luogu.org/problemnew/show/P4221 首先考虑判定一个子图是否合法: (1)连通:并查集判断即可. (2)没有欧拉回路:存在欧拉回路的条件 ...
- [ DLPytorch ] 注意力机制&机器翻译
MachineTranslation 实现过程 rstrip():删除 string 字符串末尾的指定字符(默认为空格). 语法:str.rstrip([chars]) 参数:chars -- 指定删 ...