首页 > python基础教程> 详细内容
(44)python少儿编程之函数(五)--- 作用域
日期:2020-02-26 

函数嵌套

  • 在一个函数内定义了另一个函数

(44)python少儿编程之函数(五)--- 作用域
  • 如图,定义了一个outer函数,然后在outer函数里面又定义了一个inner()函数,此时我们只能在outer函数调用inner()函数,如果在outer函数外调用inner函数就会报错,那这里就引出了一个概念,作用域。
  • 函数有可见范围,这就是作用域的概念
  • inner这里成为是outer函数的内部函数,不能在外部直接被调用,否则就会报错!

作用域

  • 一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域。
  • 全局作用域
    • 在整个程序运行环境中都可见
  • 局部作用域
    • 在函数、类等内部可见
    • 局部变量使用范围不能超过其所在的局部作用域

(44)python少儿编程之函数(五)--- 作用域
    • 如图,x就是全局作用域 fn1和fn2函数都可以使用 但是y就是只能在fn1内使用,如果再fn2使用就会报错!
  • 为了更明确的理解,我们再来看一个例子

(44)python少儿编程之函数(五)--- 作用域
  • 都为o,一个是outer2函数的变量,一个是内部函数inner的变量,当我们更改了内部函数o的值你会发现,内部函数打印出来的是97,但是在在外部函数继续打印的时候,还是原来的65,内部函数的更改,其实没有影响外部变量o的值,所以这个例子更能反映作用域的概念!
  • 从这个例子可以看出
    • 外层变量作用域在内存作用域是可见的
    • 内层作用域,如果定义了o = 97,其实相当于重新定义了一个变量o,但是这个o并没有覆盖外层作用域outer中的o
    • 我们再来看一个例子

(44)python少儿编程之函数(五)--- 作用域
  • 如图,首先我们全局变量定义了一个x,然后在函数内做了自加1的操作,然后系统就报错了,这是为什么呢?
  • 其实这里也解释了上面的概念,首先x += 1 就是 x = x +1 ,这个操作等于在foo函数里面又定义了一个x变量,就跟外面的x无关了,但是这个x都没赋值过,也不知道什么类型,然后就去 +1,自然就报错了!
  • 那怎么解决这个问题呢,有时候我们就想用这个全局变量呢?

全局变量global

(44)python少儿编程之函数(五)--- 作用域
  • 如图,使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x
  • 全局作用域中必须有x的定义
  • 那如果全局作用域没有这个定义呢? 答案是要报错的!
  • 那再思考一个问题,如果在内部函数定义全局变量以后,外部能访问到吗?

(44)python少儿编程之函数(五)--- 作用域
  • 如图,我在foo函数内,定义了一个x=10,然后加1,在外部打印后变成11,说明结果正确!这里的x的作用域一直都是全局的!
  • globel总结
    • 内部作用域使用x=10的赋值语句会重新定义局部作用域使用的变量x,但是这个作用域一旦使用过globe声明过,那么x=10就等于为全局作用域的变量x赋值
    • 但是即使外部作用域的变量可以在内部作用域使用,但也不要直接那样用,函数就是为了封装,跟外界隔离,尽量用函数的形参传参来解决,所有,最后总结一句话,就是不要用 globel,学习它只是为了深刻理解变量作用域而已!切记!