1、命名空间
#内置命名空间 —— python解释器
# 就是python解释器一启动就可以使用的名字存储在内置命名空间中
# 内置的名字在启动解释器的时候被加载进内存里
#全局命名空间 —— 我们写的代码但不是函数中的代码
# 是在程序从上到下被执行的过程中依次加载进内存的
# 放置了我们设置的所有变量名和函数名
#局部命名空间 —— 函数
# 就是函数内部定义的名字
# 当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了
#在局部:可以使用全局、内置命名空间中的名字
#在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
#在内置:不能使用局部和全局的名字的
2、作用域
# 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()
# 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()
# 对于不可变数据类型 在局部可是查看全局作用域中的变量
# 但是不能直接修改
# 如果想要修改,需要在程序的一开始添加global声明
# 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
3、全局变量和局部变量
a = 10 def func(): a = 20 print(a) func() #输出10
4、global用法
1. 可以把全局中的内容引入到函数内部
2. 如果没有则在全局创建一个变量
a = 10 # 全局变量本身就是不安全的, 不能随意修改, 闭包 def func(): global a a = 20 print(a) func() #输出20
5、nonlocal用法(没找到会报错)
def outer(): a = 10 def inner(): # 在inner中改变a的值 nonlocal a # 寻找外层函数中离他最近的那个变量 a = 20 inner() print(a) outer()
6、案例说明
a = 1 def fun_1(): a = 2 def fun_2(): nonlocal a a = 3 def fun_3(): a = 4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) fun_1() print(a) #输出1 #2 #3 #4 #3 #3 #1
7、例题
1、此题需注意是个大坑
def extendlist(val,list=[]): list.append(val) return list list1 = extendlist(10) list2 = extendlist(123,[]) list3 = extendlist('a') print('list1=%s' %list1) print('list2=%s' %list2) print('list3=%s' %list3) #输出 # list1=[10, 'a'] # list2=[123] # list3=[10, 'a']
2、
def func(): result = [] hua = ["红心","草花","黑桃","方块"] shuzi = [2,3,4,5,6,7,8,9,10,'J','Q','K','A'] for i in hua: for j in shuzi: result.append([i,j]) return result print(func())
3、
def calc(a,b,c=2,d=4): return (a+b)*(c-d) print(calc(1,2,5,d=4)) print(calc(1,2,c=5,4))#会报错需注意
4、
def func(*args): sum = 0 for i in args: sum = sum + i print(sum) func(1,2,3)
5、
def func(*args):#打散 print(args) func(*[1,2,3,4],*"你好啊") #输出(1, 2, 3, 4, '你', '好', '啊')
6、九九乘法表
for i in range(1,10): for j in range(1,i+1): print("%sx%s=%s" %(i,j,i*j),end=" ") print()