目录
函数内部的函数只能在函数内部调用,不能再函数外部调用,要想知道为什么,我们就需要了解名称空间和作用域
名称空间(name spaces):在内存管理那一章节中,我们知道变量的创建其实就是在内存开辟了一个新的空间。但是变量名的存储之前一直没有提及,其实在内存中有一块内存存储着变量名与变量之间绑定关系的空间,这个空间叫做名称空间
int、float、len、strip
a、f、l、i
a = 0
def f():
pass
l = [2,'k']
if 2>1:
if 0<1:
i = 6
f2
def f():
def f2():
print('ha')
f2
f()
由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,就必须从名称空间中的三者之一找,查找顺序是,从当前的所在位置开始查找,如果当前所在的位置为局部名称空间,则查找顺序为:局部名称空间---->全局名称空局---->内置名称空间(也就是从当前位置开始,只会往外找)
x = 0
y = 1
def f():
x = 66
y = 233
print(x,y)
f() # 66 233
```python
x = 0
def f():
print(x)
x = 6
f() #6
```
x = 6
def f():
print(x)
f() # 6
def f1():
def f2():
def f3():
print(x)
x = 1
f3()
f2()
f1() # 1
x = 1
def f(): # 函数定义阶段
print(x) # 由于f()函数的局部作用域没有x,所以会先去全局找,此时x=1
def f2():
x = 6 # 这个x只能在f2()函数的局部作用域起作用,对f()函数没有丝毫影响
f()
f2() # 1
def f():
def f1():
print('hah')
return f1
a = f()
def f2():
a()
f2() # hah
x = 1
def f():
x = 6
def f2():
x = 233
f2()
f()
print(x) # 在当前位置查找,所以是全局作用域的x=1
x = 1
def f():
x = 6
def f2():
global x # 可以将局部变量变为全局变量
x = 233
f2()
f()
print(x) # 233
x = 1
def f():
x = 6
def f2():
x = 233
f2()
print(x)
f() # 6
x = 1
def f():
x = 6
def f2():
nonlocal x # 可以使内部函数变量在外部也能使用,但不能修改为全局变量
x = 233
f2()
print(x)
f() # 233
1.在局部想要修改全局的可变类型,不需要任何声明,可以直接修改
2.在局部想要修改全局的不可变类型,需要借助global声明,声明为全局变量
lis = []
def f():
lis.append(1)
# 函数调用前
print(lis) # []
# 函数调用后
f()
print(lis) # [1]
原文:https://www.cnblogs.com/itboy-newking/p/10953501.html