7. 作用域。 这里主要给出一个基本的理解。 如上所述,
a. 一个 Python 文件就是一个模块,该模块的变量的作用域主要可分为全局作用域,本地作用域以及内置作用域。
b. 代码块(例如, try块,if-else, for , while 等),函数中定义的变量,方法,类等属于本地作用域, 可以通过 locals() 查询,作用范围在创建时到代码块或函数退出为止; 函数之外的变量,方法,类等属于全局作用域,作用范围从创建时到整个文件末尾为止,可以通过 globals() 查询。
c. 当全局作用域的变量与本地作用域的变量冲突时,会优先采用本地作用域中的变量,查找不到时再到全局作用域中查找。要使用全局作用域的变量,必须先声明 global var. 声明global var 之前不能出现同名变量 var. 请看:
x = 2
def fun1() :
x = 3
print "[1] x = " , x // 使用局部变量x 打印 [1] x = 3
print "init: x = " , x // 使用全局变量x 打印 init x = 2
fun1()
print "after [1] x = ", x // 不会改变全局变量x 打印 after [1] x = 2
def fun2() :
global x // 声明使用全局变量 x
x = 3
fun2()
print "after fun2 : x = ", x // 打印 after fun2: x = 3
def fun3() :
x = 0
#ERROR global x : 语法错误: x 不能既是全局变量又是局部变量。也就是说,
print "[3] x = ", x : 要使用全局变量,不可以出现在同名的局部变量之后。
fun3()
内置作用域是python 语言所定义的系统变量,方法,类等的作用域, 可以直接使用。 例如, type 函数可以打印对象的类型。
print type(x) // 打印 <type 'int'>
def type(x) :
print "my type(): "
return x*2
print type(x) // 打印 6
因此,可以得到又一条结论: 如果定义了与内置方法同名的方法, 会优先采用自定义的方法。 事实上, 作用域的优先级:
本地作用域 》 全局作用域 》 内置作用域
8. 异常机制。 try-except , try-except-else, try-finally, try-except-finally 四种。