您的位置:首页 > 编程语言 > Python开发

Python中变量作用域问题——局部变量与全局变量

2015-10-28 21:56 936 查看
参考文章1:红黑联盟

1,关于几种函数的简称(非原创)

L:local,局部作用域,即函数中定义的变量;

E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

G:global,全局变量,就是模块级别定义的变量;

B:built-in,系统固定模块里面的变量,比如int, bytearray等。

搜索变量的优先级顺序依次是:局部作用域>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB

以下代码能很好的表示它们之间的关系:

x = int(10) #python内置作用域B
y = 2 #当前模块中的全局变量G
def outfuction():
outfx = 2 #外层作用域E
def infunction():
infx = 3 #局部作用域L


P.S. 局部作用域和外层作用域是相对而言的。

2,作用域是怎么产生的?

会引入新的作用域:模块(module),(class)以及函数(def、lambda)

不会引入新的作用域:其它的代码块(如if、try、for等)

成功的例子:

if true:
x = 3
print x


失败的例子:

def main():
x = 3
main()
print x


3,变量的修改:

一个不在局部作用域里的变量默认是只读的,如果试图为其绑定一个新的值,python认为是在当前的局部作用域里创建一个新的变量,也就是说在当前局部作用域中,如果直接使用外部作用域的变量,那么这个变量是只读的,不能修改。

如果没使用过这个变量,而直接赋值,会认为是新定义的变量,此时会覆盖外部作用域中变量(L > G)

3,那到底怎么修改呢?

答案是:运用global与nonlocal.

当变量在全局作用域上的时候,可以这么使用:

x = 1
def outfx():
global x  #global改变了G区变量
print x
count = 2
print x
outfx()


当变量在父作用域的时候,必须这么使用:

def outfx():
x = 1
def infx():
nonlocal x  #nonlocal改变了E区变量
x = 2
print x
infx()
print x
outfx()


下一篇应该就是更深层次的东西了,希望能写写文件这方面的东西,还想顺带写写类和继承。——作者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息