简介
- 变量有作用范围限制
分类
- 按作用域可分为两类
- global: 全局变量,在函数外部定义
- 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