Python 作用域

来源:互联网 发布:java重载的内部调用 编辑:程序博客网 时间:2024/06/05 10:09

Python 作用域

首先申明下,本文为笔者学习《Python学习手册》的笔记,并加入笔者自己的理解和归纳总结。

1、作用域基本规则

(1) 变量名引用查找,首先是本地,其次是函数内,然后是全局,最后是内置。
(2) 所有def函数内赋值的变量名,默认均是本地变量,除非在之前声明为全局变量。
(3) 在def函数之外给一个变量名赋值时,本地作用域与全局作用域是相同的。

>>> (a, b, c) = (1, 2, 3)     # 定义全局变量a, b, c>>> def fun1():    a = 11                    # a变量在方法fun1内定义,默认是本地变量    def fun2():        b = 21                # b变量在方法fun2内定义,默认是本地变量        print a, b, c         # a和b是本地变量,c是全局变量    fun2()>>> fun1()11 21 3>>> a, b, c                   # a和b没有被修改(1, 2, 3)

2、全局变量

(1) 跨文件访问
在文件mymod.py中

valA = 13valB = "Hello World"
访问mymod模块。
>>> import mymod              # import导入mymod>>> print mymod.valA          # 访问mymod模块的变量valAHello World>>> mymod.valB += 3           # 修改mymod模块的变量valB>>> print mymod.valB16
(2) 文件内函数访问
在函数中访问全局变量。

>>> x = "Hello World!">>> def fun():    print x                   # 直接访问变量x>>> fun()Hello World!
(3) 函数内修改全局变量
在函数内对任何一个变量的赋值,都会在本地变量上修改。除非调用global,声明该变量为全局变量。

>>> x = "Hello World!">>> def fun():    global x                  # 声明x是全局变量    x = "welcome"             # 重新对x赋值>>> fun()>>> x'welcome'
(4) global声明变量可以在全局没有声明过。
>>> def fun():    global b                  # 变量b没有在全局被定义过    b = 17>>> b                         # b没有被定义Traceback (most recent call last):  File "<pyshell#5>", line 1, in <module>    bNameError: name 'b' is not defined>>> fun()                     # 调用方法fun,b被定义为全局变量>>> b17

3、循环中访问变量

嵌套函数在调用时才会使用变量,这时候参数都是同一个值。
>>> L = [1, 2, 3, 4, 5]>>> actions = []>>> for x in L:    def fun():                # 定义方法fun        print x ** 2,         # 使用循环中的变量xactions.append(fun)>>> for ac in actions:ac()25 25 25 25 25
在方法中添加参数记录值。
>>> actions = []>>> for x in L:    def fun(i = x):           # 定义方法fun,设置参数i        print i ** 2,    actions.append(fun)>>> for ac in actions:ac()1 4 9 16 25

4、访问函数内的本地变量。

>>> def fun1():    param = 12                # param是一个本地变量    def fun2():        print param           # 可以访问变量param        param = 13            # 修改param的值,会引发异常fun2()>>> fun1()Traceback (most recent call last):  File "<pyshell#132>", line 1, in <module>    fun1()  File "<pyshell#131>", line 6, in fun1    fun2()  File "<pyshell#131>", line 4, in fun2    print paramUnboundLocalError: local variable 'param' referenced before assignment

0 0