【有书共读01】《python学习手册》读书笔记十一

第十七章:作用域
在c里,有全局变量和局部变量之分.
变量使用前需要先定义
变量的作用域是其所在的大括号内.
python中有类似的设定,也有不同的地方.
首先是函数:
函数里定义的变量名只能在函数里使用
函数里定义的变量名与外部的不冲突
这与c的设定类似
在任何情况下,一个变量的作用域,总是由在代码中被赋值的地方所决定,并且与函数调用没有关系.
变量可以在三个不同的地方分配,分别对应下面三种不同的作用域
  1. 如果一个变量在def内赋值,他被定位在这个函数内.
  2. 如果一个变量在嵌套的def中赋值,对于嵌套的函数来说,他是非本地的.
  3. 如果在def之外赋值,他就是整个文件全局的

先从几个典型的案例来看下名称空间及作用域对python代码运行的影响,请看下面几个代码实例及其执行结果,是否符合你的预期。


代码1:块作用域


if True:
i = 1
print i
执行结果: 1

代码2:函数作用域
def f():
i = 1
f()
print i

执行结果:执行报错“NameError: name 'cc' is not defined”

代码3:静态作用域
i = 1
def test():
i += 1
test()

执行结果:执行报错“UnboundLocalError: local variable 'i' referenced before assignment”

代码4:静态作用域
i = 1
def g():
print i
def f():
i = 2
g()
f()

执行结果: 1


代码5:闭包、全局作用域
i = 1
def f():
i = 2
def g():
print i
return g
func = f()
func()
print i

执行结果:2    1

PS:python2.1之前执行该代码会报错,闭包(嵌套作用域)是在之后引入的概念,内部函数g()只能访问本函数中的命名空间、全局命名空间、内建命名空间,无法访问外部调用函数的命名空间。

注意:
  • 内嵌的模块是全局作用域
  • 全局作用域的范围仅限于单个文件
  • 每次对函数的调用都创建了一个新的本地作用域
  • 赋值的变量名  除非声明为全局变量或者非本地变量,否则均为本地变量
  • 所有的其他变量名都可以归纳为本地,全局,或内置的.

在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用。赋值操作就是名字和对象的绑定或重绑定。这和C++中的引用是一样的。

1,基础概念

1.1 命名空间(namespace)

A namespace is a mapping from names to objects

命名空间是名字和对象的映射。

也就是可以把一个namespace理解为一个字典,实际上很多当前的Python实现namespace就是用的字典。

各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
那么哪些可以是一个namespace呢,比如Python的built-in names(包括内置函数,内置常量,内置类型);

一个模块的global names(这个模块定义的函数,类,变量);

一个函数的所有local names;还有一个类对象的所有属性(数据成员,成员函数)都组成一个命名空间。
命名空间都是有创建时间和生存期的。

对于Python built-in names组成的命名空间,它在Python解释器启动的时候被创建,在解释器退出的时候才被删除;

对于一个Python模块的global namespace,它在这个module被import的时候创建,在解释器退出的时候退出;

对于一个函数的local namespace,它在函数每次被调用的时候创建,函数返回的时候被删除。

[总结]一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。


1.2 作用域(scope)

A scope is a textual region of a Python program where a namespace is directly accessible.

作用域是Python程序(文本)的某一段或某些段,在这些地方,某个命名空间中的名字可以被直接引用。这个作用域就是这个命名空间的作用域。

一个Python程序的几个作用域:

  1. 最里面的局部作用域
  2. 外层函数的局部作用域
  3. 模块的全局作用域
  4. 包含Python内置对象的最外层作用域



#笔记##读书笔记#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务