|
|
51CTO旗下网站
|
|
移动端

3.5 变量作用域

《自学Python:编程基础、科学计算及数据分析》第3章Python 进阶,在本章中,我们将学习 Python的一些进阶用法,包括函数的进阶,迭代器、生成器、装饰器、上下文管理器的使用,以及 Python中的变量作用域。本节为大家介绍变量作用域。

作者:李金来源:机械工业出版社|2018-05-04 13:53

3.5 变量作用域

函数外部定义的变量可以在函数里面使用、修改和重新赋值,这涉及 Python中变量作用域的问题。变量作用域(Variable Scope)是指变量的有效生存空间。

在函数中,Python会按照以下顺序,在各个作用域的命名空间中寻找变量:

函数局部作用域(Local Function Scope);

闭包作用域(Enclosing Scope);

全局作用域(Global Scope);

内置作用域(Built-in Scope)。

如果有重名的变量,局部优先于闭包,闭包优先于全局,全局优先于内置。

函数局部作用域是函数内部的作用域,例如:

  1. def foo(a,b):  
  2.     c = 1 
  3.     return a + b + c 

在这个函数 foo中,所有的变量都在这个函数的局部作用域中。

函数局部作用域中的变量离开了这个函数就不起作用了,因此,我们不能在函数外面调用函数foo里面的变量c。全局作用域指的是函数外面所定义的变量,例如:

  1. c = 1 
  2. def foo(a,b):  
  3. return a + b + c 

变量 c在全局作用域定义,在函数 foo里被使用。

之前说过,对于一个全局变量,如果我们在函数内部对它重新赋值,它会被认为是一个局部变量:

  1. c = 1 
  2. def foo(a,b):  
  3. c = 2 
  4. return a + b + c 

在这个例子中,函数中的 c是一个局部变量,它与全局中的变量 c不同,也不会影响全

局变量c的值。如果想在函数中对全局变量重新赋值,可以使用关键字global。

例如,我们在函数中加入global c:

  1. In [1]: c = 1 
  2. In [2]: def foo(a,b):  
  3. ...: global c  
  4. ...: c = 2 
  5. ...: return a + b + c  
  6. ...:  
  7. In [3]: foo(1, 2)  
  8. Out[3]: 5  
  9. In [4]: c  
  10. Out[4]: 2 

加了global关键字之后,c的值在foo中被改变了,所以现在 c的值是2。

如果我们不加 global,Python首先在局部作用域中寻找到了变量 c,这个 c对全局变量没影响,全局的 c仍然是1:

  1. In [5]: c = 1 
  2. In [6]: def foo(a,b):  
  3. ...: c = 2 
  4. ...: return a + b + c  
  5. ...:  
  6. In [7]: foo(1, 2)  
  7. Out[7]: 5  
  8. In [8]: c  
  9. Out[8]: 1 

在 Python中,只要变量被使用了,它的值就会存在于当前的作用域而不会消失,即使变量在循环语句或者判断语句中定义。

例如,当我们执行这个循环之后:

  1. for i in range(10):  
  2. if i % 2 == 0:  
  3. j = True 
  4. if i > 11:  
  5. k = False 

当前的作用域中会存在:

变量 i,值为 9,因为 for循环最后一个迭代的值是 9;

变量j,值为True,因为在循环过程中条件i%2==0会被满足;

变量 k不存在,因为 i>11是个不会被满足的条件,所以 k没有被赋值,因此不在当前作用域中。

内置作用域是存储内置函数或对象的作用域。

这些对象包括函数名 len、sum、int、type等,它们都可以在标准库模块__builtin__中找到:

  1. In [9]: import __builtin__  
  2. In [10]: len is __builtin__.len  
  3. Out[10]: True 

我们最后介绍闭包作用域的概念。

考虑这个函数中嵌套函数的例子:

  1. In [11]: def outer():  
  2. ...: a = 1 
  3. ...: def inner():  
  4. ...: return a  
  5. ...: return inner  
  6. ...:  
  7. In [12]: f = outer()  
  8. In [13]: f()  
  9. Out[13]: 1 

对于 inner()函数,它调用的变量 a既不在在函数 inner()的函数局部作用域中,也不在全局作用域中,而是于两者之间的作用域。人们把这个作用域起名叫闭包作用域。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网络工程师考试考前冲刺预测卷及考点解析

本书依据最新版《网络工程师考试大纲》的考核要求,深入研究了历年网络工程师考试试题的命题风格和试题结构,对考查的知识点进行了提炼,并...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊