作为初学者,简单总结自己对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命名空间和作用域的基本认识和一点小魔法相关推荐

  1. python命名空间特性_Python命名空间与作用域

    名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分 作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种:内置名称空间 全局名称空间 ...

  2. python 命名空间报错_python命名空间与作用域

    命名空间不共享名称. 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联.但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称.也就是说, ...

  3. el 能否定义作用域变量_python命名空间和作用域

    一.命名空间 1.定义:命名空间(Namespace)是从名称到对象的映射 2.实现:大部分的命名空间都是通过 Python 字典来实现的 3.目的:命名空间提供了在项目中避免名字冲突的一种方法 4. ...

  4. python内置作用域_python中的作用域

    python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:glo ...

  5. python 函数进阶_python之函数进阶

    1. 今日内容 1.1 函数的参数 *的魔性用法 函数形参最终顺序 1.2名称空间 全局名称空间,局部名称空间,内置名称空间 取值顺序与加载顺序 作用域 内置函数:globals() locals() ...

  6. python函数应用_Python 函数及其应用

    Python函数: 一个具有独立功能的代码块,重复使用时,那么往往就需要使用函数把这块代码封装成一个整体. 一.定义函数: def 函数名(): 函数代码 定义一个函数,函数不会执行,要执行需要调用函 ...

  7. python函数局部变量_Python局部函数– functoolspartial()

    python函数局部变量 什么是Python局部函数? (What is a Python Partial Function?) Sometimes a function accepts multip ...

  8. python函数结构_Python代码结构:函数

    欢迎关注「issnail」 "一起学习,一起成长!" 1.定义函数与调用函数 定义python函数:依次输入def.函数名.带有函数参数的圆括号,最后紧跟一个冒号(:) 函数命名规 ...

  9. python 函数修饰_python修饰函数 python 函数有多个修饰符

    define的意思,用来定义函数. 如: def 函数名(参数1, 参数2, --, 参数N): 执行语句 # 例:简单的函数使用# 定义函数def hello(): print 'hello pyt ...

最新文章

  1. mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路
  2. 「蚂蚁」狂奔!最高估值4600亿美金,或成今年全球最大IPO
  3. linux zip 命令详解
  4. 966计算机综合,中职计算机基础 (966)(10页)-原创力文档
  5. 大数相乘(大数阶乘模板)
  6. ajax 微信code获取_ajax 实现微信网页授权登录的方法
  7. 并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和
  8. 如何把winform图片背景换成透明颜色_如何用photoshop更换图片背景颜色?
  9. 使用MediaCodec硬解码h.265视频及音频进行播放
  10. 计算机应用技术 应聘职位,计算机应用技术求职简历范文
  11. git本地仓库基本使用(Repository)
  12. 如何将qlv格式视频转换成mp4格式
  13. C语言数组排序——选择排序
  14. 360众测考核简单记录
  15. css彩虹·,web前端入门到实战:纯CSS画动态彩虹
  16. NAO学习第二周——NAOqi Audio
  17. 史上最全程序员视频+电子书资源分享
  18. 查壳去壳和加壳的使用指南
  19. 基于Php门禁系统设计与实现
  20. unity 相同材质不同属性怎么合批

热门文章

  1. Robust.ai 获得 1500 万美元融资,嘴炮 Gary Marcus 也难逃真香定律
  2. 乘“峰”而上,聚生态之力共创软件产业新未来
  3. Nature 子刊重磅:腾讯与钟南山团队发布新冠危重症 AI 预测模型 Cox
  4. 三大运营商将解决新老用户套餐不同权问题;罗永浩与抖音合作;Git 2.26发布 | 极客头条...
  5. 疫情期间我们与你同在:关爱障碍群体刚需,坚持做无障碍的倡议书
  6. 开幕倒计时3天 | 2019中国大数据技术大会(BDTC)邀您一同共赴大数据+AI盛宴!...
  7. 刷爆了!这份被程序员疯传的 Python 神作牛在哪?
  8. 余承东吐槽苹果续航;微软 IE 浏览器被曝漏洞;React Native 0.61.0 发布 | 极客头条...
  9. 不得了!这个 AI 让企业家、技术人员、投资人同台“互怼”
  10. 网易邮箱账号遭公开叫卖;任正非谈华为接班人;中科协回应提名李彦宏增选院士 | 极客头条...