python的变量从作用域分为了以下几种:
- 局部作用域 L(local)
- 闭包函数外的函数中 E(Enclosing)
- 全局作用域 G(global)
- 内建作用域 B(build-in)
python执行时查找作用域的顺序是L-E-G-B,即:先在局部找,局部找不到去局部外的局部(闭包),然后是全局再到内建
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,被叫做局部变量,定义在函数外的拥有全局作用域的变量,被称为全局变量
所谓的局部变量是相对的。局部变量也有可能是更小范围内的变量的外部变量
a=1
def func():
b=2
try:
print(a,b)
print(c)
except Exception as e:
print('变量不存在')
def inner():
c=3
print(a)
print(b)
print(c)
inner()
func()
输出结果
1 2
变量不存在
1
2
3
结果可以看出:
a是全局变量,b,c是局部变量,c相对func是局部变量
global,nonlocal
global:指定当前变量使用外部的全局变量
nonlocal:修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量
看一下例子:
a = 1
print("函数outer调用之前全局变量a的内存地址: ", a)
def outer():
a = 2
print("函数outer调用之时闭包外部的变量a的内存地址: ", a)
def inner():
a = 3
print("函数inner调用之后闭包内部变量a的内存地址: ", a)
inner()
print("函数inner调用之后,闭包外部的变量a的内存地址: ", a)
outer()
print("函数outer执行完毕,全局变量a的内存地址: ", a)
输出结果应该是1,2,3,2,1
如果,inner内部想使用outer里面的那个a,而不是全局变量的那个a,使用nonlocal
```python
a = 1
print("函数outer调用之前全局变量a的内存地址: ", a)
def outer():
a = 2
print("函数outer调用之时闭包外部的变量a的内存地址: ", a)
def inner():
nonlocal
a = 3
print("函数inner调用之后闭包内部变量a的内存地址: ", a)
inner()
print("函数inner调用之后,闭包外部的变量a的内存地址: ", a)
outer()
print("函数outer执行完毕,全局变量a的内存地址: ", a)
<div class="se-preview-section-delimiter"></div>
输出结果:1,2,3,3,1
Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时机的位置
比如一下代码:
“`
“`
输出结果:1,2,3,3,1
Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时的位置
比如一下代码:
“`python
name =’jack’
def f1():
print(name)
def f2():
name = ‘eric’
f1()
f2()
```python
name = 'jack'
def f2():
name = 'eric'
return f1
def f1():
print(name)
ret = f2()
ret()
考虑其输出结果