范围是静态确定并动态使用的意思是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了范围是静态确定并动态使用的意思是什么?相关的知识,希望对你有一定的参考价值。
这是我正在努力理解的类的Python文档的摘录:
范围是Python程序的文本区域,可直接访问命名空间。这里的“可直接访问”意味着对名称的非限定引用会尝试在命名空间中查找名称。
尽管范围是静态确定的,但它们是动态使用的。
我并不完全理解作者对此定义中的作用域的含义,程序的文本区域是什么,以及作用域是静态确定和动态使用的含义。我对范围有直观的理解,但我很乐意完全理解文档的定义。如果有人愿意详细说明作者的想法,我将不胜感激。
“静态定义”
有全局范围和本地范围(让我们忽略第三个)。
在调用函数之前,即静态地确定变量在某个函数中是全局的还是局部的。
例如:
a = 1
b = 2
def func1():
c = 3
print func1.__code__.co_varnames # prints ('c',)
静态地确定func1
有一个局部变量,它的名字是c
。静态地,因为它是在创建函数后立即完成的,而不是在实际访问某个局部变量时。
这会带来什么后果?好吧,例如,这个函数失败了:
a = 1
def func2():
print a # raises an exception
a = 2
如果范围在Python中是动态的,那么func2
将打印1.相反,与print a
一致,已知a
是局部变量,因此不会使用全局a
。本地a
也不会被使用,因为它尚未初始化。
“动态使用”
另一方面,名称的实际搜索是在运行时动态完成的 - 但是,语言定义在“编译”时朝着静态名称解析发展,所以不要依赖于动态名称解析! (事实上,局部变量已经静态确定。)
全局变量存储在字典中。当访问全局变量a
时,解释器在该字典中查找键a
。这是动态的用法。
本地变量不会以这种方式使用。解释器事先知道函数有多少变量,因此它可以为每个变量提供一个固定的位置。然后,可以通过简单地取“第二局部变量”或“第五局部变量”来优化访问局部变量xy
,而不实际使用变量名。
以上是关于范围是静态确定并动态使用的意思是什么?的主要内容,如果未能解决你的问题,请参考以下文章