"actual search of names is done at runtime"在python中是什么意思?



文档声明:

重要的是要认识到作用域是通过文本确定的:在模块中定义的函数的全局作用域就是该模块的命名空间,无论函数是从哪里调用的,也不管函数是通过什么别名调用的。另一方面,对名称的实际搜索是在运行时动态完成的

我理解第一部分:范围是通过文本确定的。但是,实际的名称搜索是在运行时动态完成的,这意味着什么?而不是什么?

例如,让我们尝试将其与C中发生的情况进行比较,因为我知道这与Python中发生的相反。

在C中,考虑以下代码:

int a = 5
printf("The value of a is: %dn", a);

因此,在C中,对名称的实际搜索是在编译时完成的,这意味着printf函数的编译机器代码将包含对a内存地址的引用,而在Python 中

a = 5
print(a)

print(a)的编译代码将包含在名称空间字典中查找a指向的内容,然后访问它的指令

这是正确的吗?

这意味着一个名称可能会突然开始解析为其他名称,因为它是在程序执行过程中重新定义的。另一种选择是在读取和解析程序时解析名称,并坚持这种解释。(这会更快一些,允许相当多的额外优化,例如通过"了解"Python内置函数的默认行为;但这不是该语言的设计方式。(

下面是一个突然改变行为的例子:

for n in range(3):
print(max([10, 20, 30]))
max = min

这个循环将打印您在第一次迭代中所期望的内容,但从那时起,标识符max将引用本地变量max,并解析为内置min()。愚蠢但现实的用例是另一个问题。。。

与编译时静态完成相反。

例如,在像C或Rust这样的语言中,默认情况下,在编译时会查找符号,而在运行时,代码只会转到编译过程中解决的任何问题。

然而,在Python中,每次调用函数时,解释器都会在相关范围中查找名称,然后在该时间点使用绑定到该名称的任何内容。语义上,如果不一定是技术上的。

因此,例如,如果您交换分配给该名称的对象,那么代码将调用remplaiment而不是原来的。即使替换根本不可调用。

最新更新