python作用域
还是考核的时候判断失误了。
来看两个例子:
例子一:下面执行后会输出什么结果?
def test():
print(luffy)
luffy = "the king of sea."
test()
结果:
输出: the king of sea.
因为此例子中存在两个作用域,一个是全局作用域,一个是函数内的作用域,打印是在函数内部,首先它会在函数内部作用域找luffy变量,没有找到,所以会到函数外一层的全局作用域里去找,找到了luffy变量,所以就打印出了luffy的值。
这里尽管 luffy变量是在函数定义之后,但是调用是在最后面,在调用之前全局作用域中就已经将luffy存入了,所以不存在问题。
例子二: 执行后会输出什么结果?
def test():
print(luffy)
luffy = 'hello world'
luffy = "the king of sea."
test()
结果:
没有运行就已经报错了。
因为同样是作用域的概念,调用是在函数内部,首先会在函数内部的作用域查找luffy变量,函数内部有就不会再去外部查找,这里函数内部虽然有luffy变量,但是它定义在print调用之后,在定义时就已经出错了,就更不能运行了。
总结:
关于作用域,查找顺序为LEGB:
LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
- locals 是函数内的名字空间,包括局部变量和形参
- enclosing 外部嵌套函数的名字空间
- globals 全局变量,函数定义所在模块的名字空间
- builtins 内置模块的名字空间
共有 0 条评论