python函数作用域_Python命名空间和作用域的基本认识和一点小魔法
作为初学者,简单总结自己对Python命名空间(namespace)和作用域(scope)的认识。
Python在名称空间搜寻变量和函数的顺序可以认为是:
函数内部 -> (嵌套)父函数内部 -> 模块内部 -> built_in内置模块
1. 函数内部(local)
简单举例说明:
x = 123
def func():
x = 456
print 'inner x =', x
func()
print 'outer x =', x
1
2
3
4
5
6
7
8
x=123
deffunc():
x=456
print'inner x =',x
func()
print'outer x =',x
输出:
inner x = 456
outer x = 123
1
2
innerx=456
outerx=123
模块级变量x的值是123,而在函数func内部,local变量x的值是456。可以看到,函数是没有改变外部x的值的。
2. 父函数内部
x = 123
def func():
x = 456
print 'inner x =', x
def child_func():
print 'x from parent function =', x
child_func()
func()
print 'outer x =', x
1
2
3
4
5
6
7
8
9
10
11
12
13
x=123
deffunc():
x=456
print'inner x =',x
defchild_func():
print'x from parent function =',x
child_func()
func()
print'outer x =',x
输出为:
inner x = 456
x from parent function = 456
outer x = 123
1
2
3
innerx=456
xfromparentfunction=456
outerx=123
child_func是func的嵌套函数,它的x值,来自其父函数func内部,而非模块级变量。
3.模块内部
模块内也就是我们常说的全局变量。
x = 123
def func():
print 'inner x =', x
func()
print 'outer x =', x
1
2
3
4
5
6
7
x=123
deffunc():
print'inner x =',x
func()
print'outer x =',x
输出为:
inner x = 123
outer x = 123
1
2
innerx=123
outerx=123
func内部没有命名变量x,print语句使用的x来自函数外的模块级变量x。
4. Built_in内置模块
print abs(-123)
def abs(x):
return x + 100
print abs(-123)
1
2
3
4
5
6
printabs(-123)
defabs(x):
returnx+100
printabs(-123)
输出:
123
-23
1
2
123
-23
这里第一次调用的abs函数来自__builtins__。第二次调用来自模块内部。
5. 神奇的global关键字
global用于向函数中引入全局变量,这个关键字是非常神奇的。
x = 123
def func():
x = 333
if False:
global x
print 'inner x = ', x
func()
print 'outer x = ', x
1
2
3
4
5
6
7
8
9
10
x=123
deffunc():
x=333
ifFalse:
globalx
print'inner x = ',x
func()
print'outer x = ',x
按照一般的理解,global x声明位于x变量使用之后,并且,它永远不可能得到执行,那么前面x = 333使用的是local变量才是。但最终的运行结果很出乎意料:
SyntaxWarning: name 'x' is assigned to before
global declaration
global x
inner x = 333
outer x = 333
1
2
3
4
5
SyntaxWarning:name'x'isassignedtobefore
globaldeclaration
globalx
innerx=333
outerx=333
Python会给出一个警告,但打印出的结果却显示,函数中使用了模块级变量(全局变量)x。这说明,只要有global语句在源代码中,不管这条语句是否执行,也不管你把这句代码放在函数的哪个位置,python解释器都将使用全局变量。文档中提到:
the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution!
6. 被调用函数无法共享调用函数的命名空间
def caller():
x = 123
callee()
def callee():
print 'callee inner x', x
caller()
1
2
3
4
5
6
7
8
defcaller():
x=123
callee()
defcallee():
print'callee inner x',x
caller()
执行时将出现NameError: global name ‘x’ is not defined
python函数作用域_Python命名空间和作用域的基本认识和一点小魔法相关推荐
- python命名空间特性_Python命名空间与作用域
名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分 作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种:内置名称空间 全局名称空间 ...
- python 命名空间报错_python命名空间与作用域
命名空间不共享名称. 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联.但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称.也就是说, ...
- el 能否定义作用域变量_python命名空间和作用域
一.命名空间 1.定义:命名空间(Namespace)是从名称到对象的映射 2.实现:大部分的命名空间都是通过 Python 字典来实现的 3.目的:命名空间提供了在项目中避免名字冲突的一种方法 4. ...
- python内置作用域_python中的作用域
python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:glo ...
- python 函数进阶_python之函数进阶
1. 今日内容 1.1 函数的参数 *的魔性用法 函数形参最终顺序 1.2名称空间 全局名称空间,局部名称空间,内置名称空间 取值顺序与加载顺序 作用域 内置函数:globals() locals() ...
- python函数应用_Python 函数及其应用
Python函数: 一个具有独立功能的代码块,重复使用时,那么往往就需要使用函数把这块代码封装成一个整体. 一.定义函数: def 函数名(): 函数代码 定义一个函数,函数不会执行,要执行需要调用函 ...
- python函数局部变量_Python局部函数– functoolspartial()
python函数局部变量 什么是Python局部函数? (What is a Python Partial Function?) Sometimes a function accepts multip ...
- python函数结构_Python代码结构:函数
欢迎关注「issnail」 "一起学习,一起成长!" 1.定义函数与调用函数 定义python函数:依次输入def.函数名.带有函数参数的圆括号,最后紧跟一个冒号(:) 函数命名规 ...
- python 函数修饰_python修饰函数 python 函数有多个修饰符
define的意思,用来定义函数. 如: def 函数名(参数1, 参数2, --, 参数N): 执行语句 # 例:简单的函数使用# 定义函数def hello(): print 'hello pyt ...
最新文章
- mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路
- 「蚂蚁」狂奔!最高估值4600亿美金,或成今年全球最大IPO
- linux zip 命令详解
- 966计算机综合,中职计算机基础 (966)(10页)-原创力文档
- 大数相乘(大数阶乘模板)
- ajax 微信code获取_ajax 实现微信网页授权登录的方法
- 并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和
- 如何把winform图片背景换成透明颜色_如何用photoshop更换图片背景颜色?
- 使用MediaCodec硬解码h.265视频及音频进行播放
- 计算机应用技术 应聘职位,计算机应用技术求职简历范文
- git本地仓库基本使用(Repository)
- 如何将qlv格式视频转换成mp4格式
- C语言数组排序——选择排序
- 360众测考核简单记录
- css彩虹·,web前端入门到实战:纯CSS画动态彩虹
- NAO学习第二周——NAOqi Audio
- 史上最全程序员视频+电子书资源分享
- 查壳去壳和加壳的使用指南
- 基于Php门禁系统设计与实现
- unity 相同材质不同属性怎么合批
热门文章
- Robust.ai 获得 1500 万美元融资,嘴炮 Gary Marcus 也难逃真香定律
- 乘“峰”而上,聚生态之力共创软件产业新未来
- Nature 子刊重磅:腾讯与钟南山团队发布新冠危重症 AI 预测模型 Cox
- 三大运营商将解决新老用户套餐不同权问题;罗永浩与抖音合作;Git 2.26发布 | 极客头条...
- 疫情期间我们与你同在:关爱障碍群体刚需,坚持做无障碍的倡议书
- 开幕倒计时3天 | 2019中国大数据技术大会(BDTC)邀您一同共赴大数据+AI盛宴!...
- 刷爆了!这份被程序员疯传的 Python 神作牛在哪?
- 余承东吐槽苹果续航;微软 IE 浏览器被曝漏洞;React Native 0.61.0 发布 | 极客头条...
- 不得了!这个 AI 让企业家、技术人员、投资人同台“互怼”
- 网易邮箱账号遭公开叫卖;任正非谈华为接班人;中科协回应提名李彦宏增选院士 | 极客头条...