14. Python3的基本类型(变量的作用域)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值