020 函数之变量的作用域

简介

  • 变量有作用范围限制

分类

  • 按作用域可分为两类
    1. global: 全局变量,在函数外部定义
    2. local: 局部变量,在函数内部定义

变量的作用范围

  • 全局变量
    • 在整个全局范围都有效
    • 全局变量在局部可以使用
    • 即,在函数内部可以使用在函数外部定义的变量
  • 局部变量
    • 仅在特定的局部范围内有效
    • 局部变量在出了自己的范围后就无法使用
  • LEGB 原则
    • 查找一个名称的顺序:local > enclosing function locals > global > builtin
    • L(Local) 局部作用域
    • E(Enclosing function locale) 外部嵌套函数作用域
    • G(Global module) 函数定义所在模块作用域
    • B(Builtin) Python 内置模块的作用域

例1

num1 = 100  # 全局变量

def func():
    print("num1 =", num1)

    num2 = 99  # 局部变量
    print("num2 =", num2)


print("num1 =", num1)
func()
print("num2 =", num2)

>>>

num1 = 100
num1 = 100
num2 = 99
Traceback (most recent call last):
  File "main.py", line 13, in <module>
    print("num2 =", num2)
NameError: name 'num2' is not defined

例2

  • 使用 global 将局部变量提升为全局变量
def func():
    global num1
    num1 = 100
    num2 = 99
    print("num1 =", num1)
    print("num2 =", num2)


func()
print("num1 =", num1)

>>>

num1 = 100
num2 = 99
num1 = 100

globals() 与 locals()

  • 通过 globals()locals() 可以显示出全局变量和局部变量
num1, num2 = 1, 2


def func(n1, n2):
    n3 = 666
    print("Locals = {}".format(locals()))
    print("Globals = {}".format(globals()))
    
    
func(11, 22)

>>>

Locals = {'n1': 11, 'n2': 22, 'n3': 666}
Globals = {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018A4BFA0B20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'main.py', '__cached__': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x0000018A4BFA51F0>}

eval() 与 exec()

  • eval() 可以把一个字符串当成一个表达式来执行,并返回结果
  • exec()eval() 类似,但不返回结果
>>> eval("1 + 2")
3
>>> 
>>> exec("1 + 2")
>>> exec("print(1)")
1
>>> 

递归函数

简介

  • 简单地说,就是“我调用我自己”
  • 优点:简洁,容易理解
  • 缺点:对递归深度有限制,消耗资源大
  • Python 对递归深度有限制,超过限制会抛出异常,不过可以手动更改递归深度
  • 写递归程序时,要注意结束条件

例1

def func(num):
    print(num)
    func(num + 1)  # 调用自己


func(1)

>>>

1
2
3
...
995
996
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    func(0)
  File "main.py", line 3, in func
    func(num + 1)  # 调用自己
  File "main.py", line 3, in func
    func(num + 1)  # 调用自己
  File "main.py", line 3, in func
    func(num + 1)  # 调用自己
  [Previous line repeated 993 more times]
  File "main.py", line 2, in func
    print(num)
RecursionError: maximum recursion depth exceeded while calling a Python object
  • 这个深度有点意思

例2

def fib(n):
    if n <= 2:
        return 1
    return fib(n - 1) + fib(n - 2)


print(fib(10))  # 55
原文地址:https://www.cnblogs.com/yorkyu/p/10297787.html