栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python:为什么要从 禁止输入*'?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python:为什么要从  禁止输入*'?

我相信通过“在您的程序中间”,您正在谈论函数定义 的导入:

def f():    from module import *    # not allowed

不允许这样做,因为这会使优化函数主体过于困难。Python实现希望在对函数进行字节编译时知道函数局部变量的所有名称,以便可以优化对(CPython)虚拟机操作数堆栈上的操作的变量引用,或者至少对局部变量插槽的引用。操作,而不是在外部名称空间中进行查找。如果您可以将模块的全部内容转储到函数的本地名称空间中,则编译器将必须假定函数中的
任何 名称都可能引用全局模块,因为by带来的名称列表

from module import *
仅在运行时才知道。

from module import *
两者之间 顶层声明是作风不好,但它是允许的:

def f():    ...from module import *def g():    ...

编辑2013年4月:
在研究其他内容时,我发现此限制是由于“嵌套范围”功能(PEP 227)在Python
2.1中引入的。从链接引用:

更改的一个副作用是,在某些条件下,在功能范围内将

from module import*
and
exec
语句设为非法。Python参考手册一直说,这
from module import*
仅在模块的顶层是合法的,但是CPython解释器以前从未执行过此操作。作为实现嵌套作用域的一部分,将Python源代码转换为字节码的编译器必须生成不同的代码以访问包含作用域中的变量。
frommodule import*
exec
使其无法编译器摸不着头脑,因为他们的名字添加到本地命名空间是在编译时不可知。因此,如果函数包含
lambda
带有自由变量的函数定义或表达式,则编译器将通过引发
SyntaxError
异常来对此进行标记。

这阐明了注释中讨论的Python 3.x vs 2.x行为。它总是与语言规范相反,但是CPython 2.1到2.7仅

from module import*
在函数内发出错误,如果它可能会影响编译器知道变量是在本地绑定还是在包含范围内绑定的能力。在3.x中,它已升级为无条件错误。

编辑之子: …显然是flashk在几年前的另一个回答中指出了这一点,并引用了“ Python 2.1的新增功能”的同一段落。你们现在都赞成。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641150.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号