当前位置:   article > 正文

python-嵌套函数讲解_python函数嵌套

python函数嵌套

在看之前先把这篇文章的global搞懂

Python入门--python中的global_愈努力俞幸运的博客-CSDN博客_python的globalhttps://blog.csdn.net/qq_37891604/article/details/124203862

先复习一下嵌套函数

内部函数,是无法被直接调用的,内部函数只能通过外部函数来调用

  1. '''
  2. 嵌套函数
  3. '''
  4. #例1
  5. def funA():
  6. x=520
  7. def funB():
  8. x=880
  9. print('in funB x=',x)
  10. funB()#内部函数只能通过外部函数来调用
  11. print('in funA x=',x)
  12. '''
  13. 内部函数是无法被直接调用的
  14. 内部函数只能通过外部函数来调用
  15. '''
  16. '''
  17. 以下语句会报错
  18. funB()
  19. '''
  20. funA()#in funB x= 880 in funA x= 520

首先对输出的结果要会判断,不会就是还没理解python作用域。

 内部函数可以访问到外部函数的变量,但却无法修改外部函数变量的值,外部函数输出的x还是520.

例1中,内部函数外部函数,虽然都是x,但内部函数无法修改外部函数的值。

和global的例1是一样的感觉

 使用nonlocal语句,在内部函数修改外部函数的变量

  1. #例2
  2. '''
  3. 使用nonlocal语句,在内部函数修改外部函数的变量
  4. '''
  5. def funA():
  6. x=520
  7. def funB():
  8. nonlocal x
  9. x=880
  10. print('in funB x=',x)
  11. funB()#内部函数只能通过外部函数来调用
  12. print('in funA x=',x)
  13. funA()#in funB x= 880 in funA x= 880

判断例3的代码是否会报错?

  1. #例3
  2. def funa():
  3. x=5
  4. def funb():
  5. x+=1
  6. print(x)
  7. funb()
  8. print(x)
  9. funa()
  10. '''
  11. UnboundLocalError: local variable 'x' referenced before assignment
  12. '''

例1,会报错,出错原因就是global,一样,虽然在外部函数找到了x,但当对x进行修改时,会把x当成局部变量,但在funb中没定义x,所以会出错。

在global那边文章中,我们说可以加global.在嵌套函数中可以使用nonlocal

  1. #例4
  2. def funa():
  3. x=5
  4. def funb():
  5. nonlocal x
  6. x+=1
  7. print(x)
  8. funb()
  9. print(x)
  10. funa()

有个神奇的是

  1. #例5
  2. def funa():
  3. lst=[1,2]
  4. se={10,20}
  5. def funb():
  6. lst.append(3)
  7. print('内部函数中lst',lst)
  8. se.add(30)
  9. print('内部函数中se',se)
  10. funb()
  11. print('外部函数中lst',lst)
  12. print('外部函数中se',se)
  13. funa()
  14. '''
  15. 内部函数中lst [1, 2, 3]
  16. 内部函数中se {10, 20, 30}
  17. 外部函数中lst [1, 2, 3]
  18. 外部函数中se {10, 20, 30}
  19. '''

 这没加nonlocal,这怎么可以修改外部函数的变量呢?这是因为列表,集合是容器变量,可以修改。

最后给出个两个代码,检验各位看官是否理解。

  1. #例6
  2. # 定义一个外部函数outer
  3. def outer():
  4. x = 2
  5. # 定义一个内部函数inner
  6. def inner():
  7. # 在内部函数如何修改外部函数的局部变量
  8. nonlocal x # 此时这里的x不再是新增的变量,而是外部的局部变量x
  9. y = x + 1
  10. print('y为',y)
  11. x = 10
  12. print('内部函数里的x等于',x)
  13. inner()
  14. print('外部函数里的x等于',x)
  15. outer()
  16. '''
  17. y为 3
  18. 内部函数里的x等于 10
  19. 外部函数里的x等于 10
  20. '''

最后,总结

python 里内嵌函数是可以修改外部环境里的变量的

关键是细节. 如果是简单变量类型, 那么不可以.如果相修改就是用nonlocal

但是如果是容器类变量, 则没问题了.

呕心沥血之作,希望有同样疑问的朋友,可以因为本篇节省点精力。

最后给个例子巩固。 

  1. #例7
  2. # 定义一个外部函数outer
  3. def outer():
  4. a=11
  5. b=22
  6. x=[1,2,3]
  7. def inner():
  8. global c#如果想把内部变量传递到外部环境里,就必须在内部环境里声明为全局变量
  9. c=a+b
  10. #b=b+1#内部函数不能修改,简单型外部变量
  11. x.append([4,5,6])
  12. print('内部函数',a,b,c)
  13. print('内部函数',x)
  14. inner()
  15. print('外部函数',a,b,c)
  16. print('外部函数',x)
  17. outer()
  18. '''
  19. 内部函数 11 22 33
  20. 内部函数 [1, 2, 3, [4, 5, 6]]
  21. 外部函数 11 22 33
  22. 外部函数 [1, 2, 3, [4, 5, 6]]
  23. '''

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/585289
推荐阅读
相关标签
  

闽ICP备14008679号