变量的作用域

Python查找一个变量时会按照局部作用域嵌套作用全局作用域内置作用域的顺序进行搜索

  1. def foo():
  2. b = 'hello'
  3. # Python中可以在函数内部再定义函数
  4. def bar():
  5. c = True
  6. print(a) # 全局作用域
  7. print(b) # 嵌套作用域
  8. print(c) # 局部作用域
  9. # print(d)
  10. bar()
  11. # print(c) # NameError: name 'c' is not defined
  12. if __name__ == '__main__':
  13. a = 100
  14. # a 属于全局变量
  15. # print(b) # NameError: name 'b' is not defined
  16. foo()
  17. # 输出
  18. 100
  19. hello
  20. True
  • global 关键字
  1. def foo():
  2. '修改全局作用域下的变量a'
  3. # a = 200 # 不行
  4. global a
  5. a = 200 # 行
  6. b = 1000
  7. print(b)
  8. def bar():
  9. '修改嵌套作用域下的变量b'
  10. nonlocal b
  11. b = 2000
  12. bar()
  13. print(b)
  14. if __name__ == "__main__":
  15. a = 100
  16. print(a)
  17. foo()
  18. print(a)
  19. # 输出
  20. 100
  21. 1000
  22. 2000
  23. 200

在实际的开发中需要减少全局变量的使用

  • 为了降低代码的耦合
  • 全局变量生命周期长会导致对象长期存在垃圾无法回收

如果希望把局部变量的生命周期延长,在函数调用结束后仍然使用,就需要使用闭包。