大数据 爬虫Python AI SqlPython时空大数据python每天一约

python作用域

2018-10-11  本文已影响1人  Tim在路上

块级作用域??

if 1 == 1:
    name = "lzl"
 
print(name)
 
 
for i in range(10):
    age = i
 
print(age)
lzl
9

java中是不可以执行成功的但是在python中可以执行成功,,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;

函数局部作用域

def  func():
    name = "zxt"
 
print(name)

name 'name' is not defined

name变量只在func()函数内部中生效,所以在全局中是没法调用的;

作用域误区

name = "lzl"
 
def f1():
    print(name)
 
def f2():
    name = "eric"
    f1()
 
f2()
lzl

我们都知道,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
类似于下面的规则

#作用域链
 
name = "lzl"
def f1():
    name = "Eric"
    def f2():
        name = "Snor"
        print(name)
    f2()
f1()

我们再看一个代码

 
name = "lzl"
 
def f1():
    print(name)
 
def f2():
    name = "eric"
    return f1
 
ret = f2()
ret()
lzl

f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系.

静态作用域

i = 1

def g():
    a = i
    a = a + 3
    print(i,a)
    
g()
1

发现i可以找到全局变量
但是

i = 1

def g():
    i = i + 1
    a = a + 3
    print(i,a)
    
g()
local variable 'i' referenced before assignment

无法找到全局的i,原因是Python是静态作用域(词法作用域),因此在编译阶段,就决定了变量的读取方式。

上一篇下一篇

猜你喜欢

热点阅读