1、默认参数的陷阱:
当默认参数为可变数据类型时,此默认参数为共用类型,默认参数在调用时可以赋值,也可以不用赋值,如果赋值则为新的值。
1 def fun(li = []): 2 li.append(1) 3 print(li) 4 5 fun() # [1] 6 fun() # [1, 1] 7 fun() # [1, 1, 1]
1 def fun(a, dict={}): 2 dict[a] = "v" 3 print(dict) 4 5 fun(1) # {1: ‘v‘} 6 fun(2) # {1: ‘v‘, 2: ‘v‘} 7 fun(3) # {1: ‘v‘, 2: ‘v‘, 3: ‘v‘}
2、三个命名空间和两个作用域:
三个命名空间:内置命名空间、全局命名空间和局部命名空间
两个作用域:全局作用域和局部作用域
两个关键字:
global:在局部中声明,可以改变全局变量的值
nonlocal:只能改变局部变量的值,并且只改变上层局部变量的值
3、函数名的本质:
函数名指向的是内存地址,可以当作普通的变量使用,和普通变量的唯一区别是加括号后是调用函数。
4、闭包:
闭包是指内部函数必须调用外部变量,好处是可以使外部的局部变量在内存中不至于随着函数调用结束而结束,并且可以不用重复加载和回收,节省了时间。
1>不用闭包的情况:
1 def fun(): 2 a = 1 3 def inner(): 4 print(a) 5 inner() 6 7 fun()
2>使用闭包的情况:
1 def fun(): 2 a = 1 3 def inner(): 4 print(a) 5 return inner 6 7 f = fun() 8 f()
需要根据函数名的本质进行理解。
3>使用闭包的例子:
1 from urllib.request import urlopen 2 3 def get_url(): 4 url = "http://www.xiaohuar.com/" 5 def inner(): 6 ret = urlopen(url).read() 7 print(ret) 8 return inner 9 10 f = get_url() 11 f()
每次调用f()都不再需要加载网页。
原文:https://www.cnblogs.com/eric818/p/10348334.html