摘要
这几个知识点很有意思的,正好闲下来没事,说两句.
什么是作用域
用通俗的话来说作用域就是一个范围,对编程语言来说,就是当前指令的执行环境. 有点宽泛啊,不过有点基础的都能理解这句话的含义,比如类有类作用域, 类的实例有实例的作用域, 实例的方法又有方法的作用域.
一.python方法的参数(位置参数/关键字参数)
def test(name,age):
print(name,age)
这是最常见的方法参数形式,在调用的时候
test("zhangsan",20)
test(age=20,name="zhangsan")
test(name="zhangsan",age=20)
test("zhangsan",age=20)
test(name="zhangsan",20) # 这样会报错
上面参数的传值涉及到两个概念:
i:位置参数,传入的值按照顺序赋予参数中的便令
ii:关键字参数,按照指定的名称传入,可以乱序传入
如果位置参数和关键字参数混用的话,位置参数在任何时候都不能出现在关键字参数后面,否则无法识别.
二.python 收集参数* 和 **
def test2(*params):
print params
test2(1,2,3,4,5,6)//输出:(3, 4, 5, 6)
由此可见,* 关键字可以将传入方法的参数收集到元组中,然后将该元组赋予params. 这就是参数收集. 再看下面的例子
def test2(a,b,*params):
print params
test2(1,2,3,4,5,6)//输出:(3,4,5,6)
def test2(a,b,c=88,*params):
print params
test2(1,2,3,4,5,6)//输出:(4,5,6)
小朋友你是否有很多问号? 为什么?
原因就在于1,2 被位置参数a,b接收了,3被c接收了,而剩下的3,4,5,6被赋予元组变量params,所以很明显啦,python参数的解析是有优先级的,综合上面例子,可以看到,先解析位置参数,然后解析关键字参数,再然后就是*params 参数了.
说完了* 再来说**
- 接收游离参数到元组中,** 则接收k=v 参数到字典中.
def test2(a,b,c=99,*params,**keys):
"""
:type c: object
"""
print "a: %s" % a
print "b: %s" % b
print "c: %s" % c
print params
print "keys: %s" % keys
感兴趣的可以自己去测试一下.
三.python 参数反转过程又称为逆收集
也就是拆解传入的元组/字典
def test2(a,b,c=99,*params,**keys):
"""
:type c: object
"""
print "a: %s" % a
print "b: %s" % b
print "c: %s" % c
print params
print "keys: %s" % keys
test2(*(1,2,3,4,5),**{"name":"zhangsan","age":"100"})
结果如下:
a: 1
b: 2
c: 3
(4, 5)
keys: {'age': '100', 'name': 'zhangsan'}
四.python globals()
name="pg"
age="20"
li=[1,2,3,4,5]
dic={"name":"pg","age":88}
def test(name="abc",age=0,li=[],dic={}):
gl = globals()
gl["name"] = "pppg"
test()
print name //结果为:pppg
可以看到,globals()其实将全局变量收集成为一个字典,在这个字典中的变量都是全局变量,而在方法的作用域内我们可以这样去修改全局变量的值.
上面这种写法和:
def test():
globals x
x="88"
起到的效果一致.
关键在于理解globals()函数的返回值是一个字典哦.