为什么不允许在函数中使用 "from ... import *"?
Why is "from ... import *" in a function not allowed?
The wild card form of import — from module import *
— is only allowed at the module level. Attempting to use it in class or function definitions will raise a SyntaxError
.
为什么?避免在函数中使用它有什么意义?有什么问题吗?
CPython 实现对局部变量使用了特殊的优化:它们不像全局变量那样在运行时从字典中动态查找,而是在 处静态分配索引编译时,运行时按索引查找,速度快很多。这需要 Python 编译器能够在编译时识别所有本地名称,如果您在函数级别有通配符导入,这是不可能的。
在 Python 2 中,仍然有一个回退机制,在无法始终静态确定所有本地名称的情况下调用该机制。该机制使用局部变量的动态字典,显着降低了执行速度。
例如这段代码
def f():
exec "x = 2"
print x
在 Python 2 中按预期工作,而
def f():
exec("x = 2")
print(x)
在 Python 中产生 NameError
3.
The wild card form of import —
from module import *
— is only allowed at the module level. Attempting to use it in class or function definitions will raise aSyntaxError
.
为什么?避免在函数中使用它有什么意义?有什么问题吗?
CPython 实现对局部变量使用了特殊的优化:它们不像全局变量那样在运行时从字典中动态查找,而是在 处静态分配索引编译时,运行时按索引查找,速度快很多。这需要 Python 编译器能够在编译时识别所有本地名称,如果您在函数级别有通配符导入,这是不可能的。
在 Python 2 中,仍然有一个回退机制,在无法始终静态确定所有本地名称的情况下调用该机制。该机制使用局部变量的动态字典,显着降低了执行速度。
例如这段代码
def f():
exec "x = 2"
print x
在 Python 2 中按预期工作,而
def f():
exec("x = 2")
print(x)
在 Python 中产生 NameError
3.