首页 » 编程 » Python » Python学习 » 正文

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 内置模块的名字空间

 

 

 

 

发表评论