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作用域

posted @ 2016-07-11 09:38  每天进步一点点!!!  阅读(255)  评论(0编辑  收藏  举报