范围是静态确定并动态使用的意思是什么?

问题描述 投票:10回答:1

这是我正在努力理解的类的Python文档的摘录:

范围是Python程序的文本区域,可直接访问命名空间。这里的“可直接访问”意味着对名称的非限定引用会尝试在命名空间中查找名称。

尽管范围是静态确定的,但它们是动态使用的。

我并不完全理解作者对此定义中的作用域的含义,程序的文本区域是什么,以及作用域是静态确定和动态使用的含义。我对范围有直观的理解,但我很乐意完全理解文档的定义。如果有人愿意详细说明作者的想法,我将不胜感激。

python class scope namespaces
1个回答
8
投票

“静态定义”

有全局范围和本地范围(让我们忽略第三个)。

在调用函数之前,即静态地确定变量在某个函数中是全局的还是局部的。

例如:

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也不会被使用,因为它尚未初始化。

“动态使用”

来自same document

另一方面,名称的实际搜索是在运行时动态完成的 - 但是,语言定义在“编译”时朝着静态名称解析发展,所以不要依赖于动态名称解析! (事实上​​,局部变量已经静态确定。)

全局变量存储在字典中。当访问全局变量a时,解释器在该字典中查找键a。这是动态的用法。

本地变量不会以这种方式使用。解释器事先知道函数有多少变量,因此它可以为每个变量提供一个固定的位置。然后,可以通过简单地取“第二局部变量”或“第五局部变量”来优化访问局部变量xy,而不实际使用变量名。

© www.soinside.com 2019 - 2024. All rights reserved.