1 全局变量默认可以在所有函数内被访问,但如果在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情况:
In [1]: number = 'No.1'
In [2]: def testGlobalNumber():
...: #访问全局变量
...: print (number)
...: number = 'No.100'
...:
In [3]: testGlobalNumber()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-3-fb5168c702fb> in <module>
----> 1 testGlobalNumber()
<ipython-input-2-aeae860254fb> in testGlobalNumber()
1 def testGlobalNumber():
2 #访问全局变量
----> 3 print (number)
4 number = 'No.100'
5
UnboundLocalError: local variable 'number' referenced before assignment
该错误提示粗体字代码所访问的name变量还未定义。由于程序在函数中增加了number='No.100’导致的,语法规定,在函数内部对不存在的变量赋值时,默认重新定义新的局部变量值,因此,代码中重新定义了number局部变量,number的全局变量被遮蔽。因此会报错。
2 访问被遮蔽的全局变量
In [4]: def testGlobalNumber():
...: #访问全局变量
...: print (globals()['number'])
...: number = 'No.100'
...:
In [5]: testGlobalNumber()
No.1
3 在函数中声明全局变量
In [6]: def testGlobalNumber():
...: #声明全局变量
...: global number
...: #访问全局变量
...: print (number)
...: number = 'No.100'
...:
...:
In [7]: testGlobalNumber()
No.1
In [8]: print (number)
No.100
4 局部函数
被放到函数体内定义的函数,就是局部函数。默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭(enclosing)函数内有效,其封闭函数也可以返回局部函数。以便程序在其他作用域中使用局部函数。
In [11]: def get_match_cal(type, number):
...: #定义一个计算平方的据不函数
...: def square(num):
...: return num * num
...: #定义一个计算立方的局部函数
...: def cube(num):
...: return num * num * num
...: #调用局部函数
...: if type == "square":
...: return square(number)
...: else:
...: return cube(number)
...:
In [12]: print (get_match_cal('square', 4))
16
In [13]: print (get_match_cal('cube', 4))
64