python里只有全局作用域和局部作用域,因为没有像JAVA那样明显的关键字声明定义,所以新手常常被python解释器搞得稀里糊涂。
if x>0:
y = 1
print(y)
这段代码可以完美运行,因为python中没有块级作用域。
name = 0
def x():
name += 1
return name
print(x())
当看到以上这段代码就必须小心了,这里面蕴含着一个陷阱。
因为name是局部变量,在函数里不起作用,系统会发现函数里的name没有定义,所以会报错。
再看一个比较复杂的例子:
name = 'LOL'
def x():
name = 'DOTA'
def y():
name = 'CS:GO'
print(name)
y()
x()
python里有作用链域,变量的值是从内到外找的,所以这里是输出CS:GO
最后看一个比较复杂但相似的:
name = '火影忍者'
def f1():
print(name)
def f2():
name = '海贼王'
f1()
f2()
函数在没有执行前,变量已经形成了完整的作用链域,就像一条链子串好了。所以执行函数f2(),最后输出的是'火影忍者'。
网友评论