Python学习总结【第十三篇】:Python之作用域
Python作用域
1、Python中无块级作用域(对比java,c#)
# 案例1 if 1 == 1: name = "alex" print(name) # 结果:java c# 报错变量未定义 alex # 案例2 for i in range(10): name = i print(name) # 结果 9
2、Python中以函数为作用域
# 案例1: def func(): name = "alex" print(name) # 结果 NameError: name 'name' is not defined # 案例2: def func(): name = "alex" func() print(name) # 结果 NameError: name 'name' is not defined
3、Python作用域链,由内向外查找,直到找不到然后报错
# 案例1 name = 'alex' def f1(): name = 'a' def f2(): name = 'b' print(name) f2() f1() # 结果: b # 案例2 name = 'alex' def f1(): name = 'a' def f2(): print(name) f2() f1() # 结果: a # 案例3 name = 'alex' def f1(): def f2(): print(name) f2() f1() # 结果: alex # 案例4 name = 'alex' def f1(): def f2(): print(name) f2() f1() # 结果: NameError: name 'name' is not defined
4、Python作用域在执行前就已经确定,和调用执行位置无关
案例1 name = "alex" def f1(): print(name) def f2(): name = 'eric' f1() f2() # 结果: alex 案例2: name = 'alex' def f1(): print(name) def f2(): name = 'eric' return f1 ret = f2() ret() # 结果 alex
注:以案例1讲解,该程序存在两个作用域链,f1及上级作用域,f2及上级作用域。其中f2()最后输出的是f1()的结果,根据f1()的作用域链判断name = "alex",所以结果就是alex.
5、新浪面试题一例
# 预备知识1:列表 li = [x for x in range(10)] print(li) # 结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] li = [x+100 for x in range(10) if x > 6] print(li) # 结果 [107, 108, 109] # 预备知识2:lambda表达式 x = 123 def f1(): return x a = lambda :x res = f1() print(res) print(a()) # 结果均是 123,以上两个写法等效
问题:根据如下表达式,请说明r的值
li = [lambda:x for x in range(10)]
r = li[0]()
print(r)
# 问题分析 li是列表类型 li列表里面的元素为:[函数,函数,函数.....] ,即li[0]为函数 函数调用格式li[0]() 函数在未被调用前,内部代码不会被执行 x最后结果为9,带入lambda表达式,r的结果值为9
# 分析下面两段代码结果差异原因 # 代码1 li = [] for i in range(10): def f1(): return i li.append(f1) print(li[0]()) print(li[1]()) print(li[2]()) # 结果: 9 9 9 # 代码2 li = [] for i in range(10): def f1(x=i): return x li.append(f1) # li是列表,内部元素是相同功能的函数 # i print(li[0]()) print(li[1]()) print(li[2]()) #结果 1 2 3
资料:
武sir:五句话搞定JavaScript作用域
出处:http://www.cnblogs.com/madsnotes/
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。