'''
命名空间 : 每次在python解释器启动之后,就会在内存开辟一块内存空间,每当遇到一个变量时,就会在命名空间中,记录下变量名和值之间的关系,也即记录变量对应的值在内存空间中的
地址;当一个函数时,会在命名空间中记录下函数名以及函数的地址;
内置命名空间 : 解释器启动伊始开辟声明内置函数的内存空间;
局部命名空间 : 在函数内部,为变量或函数开辟的命名空间;
作用域 : 函数或变量的生命周期;
查看全局作用域中的所有内容 : globals()
查看局部作用域中的所有内容 : locals()
函数的嵌套 : 也即支持在一个函数内部可以定义另一个函数
慎用 :
当需要在局部作用域内,对全局变量进行操作时,需以global关键字声明,要直接对全局变量进行操作,这里的全局,包括绝对全局和相对全局,也即可以对所有大于当前作用域的所有
作用域内的所有变量进行声明
当需要对大于当前作用域,但又并非全局作用域内的变量进行操作时,需以nonlocal关键字声明该变量;
重点(神坑) : 定义函数时,在同一个代码块内,多次调用同一个函数,默认值参数对应的内存空间始终不变,对默认值参数进行修改也始终是在默认值参数对应内存空间上进行修改;
案例(从指针的角度理解) :
def test(value, lst = []) :
lst.append(value)
print(lst)
return lst
lst1 = test("a") #第一次调用test函数,在lst所在内存空间写入值a,打印a,并返回lst的地址
lst2 = test("b", []) #第二次调用test函数,由于我们这次没有使用lst的默认值,而是手动赋值,因此会为lst形参开辟一块新的内存空间,并写入值b,打印b,
返回新开辟的内存空间的地址;
lst3 = test("c") #第三次调用test函数,由于再次使用了lst的默认值,所以会在lst默认开辟的内存空间内写入c,也即["a", "c"],打印["a", "c"],并返回其地址;
print(lst1) #lst1接收到的为test函数为lst默认开辟的内存空间的地址,而默认的内存空间存的是["a", "c"],因此打印结果为["a", "c"]
print(lst2) #lst2接收的是为实参新开辟的内存空间的地址,存的值为["b"],因此打印结果为["b"]
print(lst3) #lst2接收到的为为默认形参lst开辟的内存空间的地址,存的值为["a", "c"],因此打印结果为["a", "c"]
结果 :
['a']
['b']
['a', 'c']
['a', 'c']
['b']
['a', 'c']
'''