为什么"来自...... import *"在一个不允许的功能?

时间:2015-01-22 16:43:54

标签: python function python-3.x python-import

来自the documentation

  

导入的外卡形式 - from module import * - 仅允许在模块级别使用。试图在类或函数定义中使用它将引发SyntaxError

为什么呢?避免在函数中使用它有什么意义?有什么问题?

1 个答案:

答案 0 :(得分:8)

CPython实现对局部变量使用特殊优化:它们不是在运行时从字典中动态查找的,因为全局变量是,而是在编译时静态分配索引,并且是在运行时通过索引查找,这要快得多。这要求Python编译器能够在编译时识别所有本地名称,如果在函数级别进行通配符导入,这是不可能的。

在Python 2中,仍然存在一种回退机制,在无法始终静态确定所有本地名称的情况下调用该机制。这种机制使用动态字典表示局部变量,大大减慢了执行速度。

例如此代码

def f():
    exec "x = 2"
    print x

在Python 2中按预期工作,而

def f():
    exec("x = 2")
    print(x)

在Python 3中产生NameError