Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
一丶关键字:global,nonlocal
global 声明全局变量:
1. 可以在局部作用域声明一个全局变量
2. 可以修改全局变量
# 解释器认为: 如果你在局部作用域对一个变量进行修改,局部作用域已经定义了好这个变量
# 异常:
# UnboundLocalError: local variable 'count' referenced before assignment
####相当于局部声明的变量,剪切到全局
count=0
print(locals()) # count:0
def func():
global count #定义成全局变量
count+=1 # 此处由于 要修改count的值, 现在函数内没有定义count的变量, 如果想要修改全局变量count 需要global声明一下
print(locals()) # 查看当前(现在就是局部空间)空间的变量和值, 没count变量
func()
print(locals()) # 查看当前(现在就是全局空间)空间的变量和值 ,count:1
nonlocal 局部作用域如果想对父级作用域的变量(python3x新加的功能):
1.可以对父级别作用域的变量进行修改,并且在当前作用域创建
2.不能操作全局作用域
####复制 , 共用一块内存地址
def func():
count=0 #局部变量
def inner():
nonlocal count #inner函数内 修改 count 变量, 需要nonlocal声明
count+=3
print(count)
print(id(count)) #id() 查看这个inene函数中count变的内存地址 -->1952940208(内存地址)
print(locals()) #查看当前作用域中的变量和值 {'count': 3}
inner()
print(locals()) #{'inner':<function func.<locals>.inner at 0x00000140E1ABBD90>, 'count': 3}
print(id(count)) #id() 查看这个func函数中count变的内存地址 1952940208(内存地址)
func()
二丶形参中---默认参数的坑
###当你的默认参数的数据类型是可变的数据类型时 千万注意,使用的是同一个可变类型数据的内存地址 so看代码