`from ... import` vs`import。`

`from ... import` vs`import。`

我想知道代码片段之间是否有任何区别

from urllib import request

和片段

import urllib.request

或者它们是否可以互换。如果它们是可互换的,那就是“标准”/“首选”语法(如果有的话)?

谢谢!


明月笑刀无情
浏览 584回答 3
3回答

慕桂英4014372

这取决于您在引用它时如何访问导入。from urllib import request# access request directly.mine = request()import urllib.request# used as urllib.requestmine = urllib.request()为简单起见,您还可以在导入时自己为别名设置别名,或者避免屏蔽内置插件:from os import open as open_# lets you use os.open without destroying the # built in open() which returns file handles.

潇潇雨雨

很多人已经解释过importvs&nbsp;from,所以我想尝试更多地解释一下,实际的差异在于。首先,让我准确解释一下基本的import语句。import X导入模块X,并在当前命名空间中创建对该模块的引用。然后,您需要定义已完成的模块路径以从模块内部访问特定属性或方法(例如:&nbsp;X.name或X.attribute)from X import *导入模块X,并创建对当前命名空间中该模块定义的所有公共对象的引用(即,没有名称的所有公共对象_)或您提到的任何名称。或者,换句话说,在运行此语句之后,您可以简单地使用普通(非限定)名称来引用模块中定义的内容X。但是X它本身没有定义,所以X.name不起作用。如果name&nbsp;已经定义,它将被新版本替换。如果将name in&nbsp;X更改为指向其他某个对象,则您的模块将不会注意到。这使得模块中的所有名称都可在本地名称空间中使用。现在让我们看看当我们这样做时会发生什么import X.Y:>>>&nbsp;import&nbsp;sys>>>&nbsp;import&nbsp;os.path检查sys.modules姓名os和os.path:>>>&nbsp;sys.modules['os']<module&nbsp;'os'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>>>>&nbsp;sys.modules['os.path']<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>检查globals()和locals()命名空间dict的名称os和os.path:&nbsp;>>>&nbsp;globals()['os']<module&nbsp;'os'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>>>>&nbsp;locals()['os']<module&nbsp;'os'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>>>>&nbsp;globals()['os.path']Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>KeyError:&nbsp;'os.path'>>>从上面的例子中,我们发现只os添加到本地和全局命名空间。所以,我们应该可以使用os:&nbsp;>>>&nbsp;os&nbsp;<module&nbsp;'os'&nbsp;from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> &nbsp;>>>&nbsp;os.path&nbsp;<module&nbsp;'posixpath'&nbsp;from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> &nbsp;>>>......但不是path:>>>&nbsp;pathTraceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>NameError:&nbsp;name&nbsp;'path'&nbsp;is&nbsp;not&nbsp;defined&nbsp; >>>删除osfrom&nbsp;locals()命名空间后,您将无法访问os或者os.path,即使它们确实存在于sys.modules:>>>&nbsp;del&nbsp;locals()['os']>>>&nbsp;osTraceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>NameError:&nbsp;name&nbsp;'os'&nbsp;is&nbsp;not&nbsp;defined>>>&nbsp;os.pathTraceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>NameError:&nbsp;name&nbsp;'os'&nbsp;is&nbsp;not&nbsp;defined>>>现在让我们来看看from。from>>>&nbsp;import&nbsp;sys>>>&nbsp;from&nbsp;os&nbsp;import&nbsp;path检查sys.modules姓名os和os.path:>>>&nbsp;sys.modules['os']<module&nbsp;'os'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>>>>&nbsp;sys.modules['os.path']<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>所以sys.modules看起来和我们导入时一样import name。好的。让我们看一下它locals()和globals()命名空间字符串的含义:>>>&nbsp;globals()['path']<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>>>>&nbsp;locals()['path']<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>>>>&nbsp;globals()['os']Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>KeyError:&nbsp;'os'>>>您可以使用path,但不能通过以下方式访问os.path:>>>&nbsp;path<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>>>>&nbsp;os.pathTraceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>NameError:&nbsp;name&nbsp;'os'&nbsp;is&nbsp;not&nbsp;defined>>>让我们从locals()中删除'path':>>>&nbsp;del&nbsp;locals()['path']>>>&nbsp;pathTraceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;&nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>NameError:&nbsp;name&nbsp;'path'&nbsp;is&nbsp;not&nbsp;defined>>>使用别名的最后一个示例:>>>&nbsp;from&nbsp;os&nbsp;import&nbsp;path&nbsp;as&nbsp;HELL_BOY>>>&nbsp;locals()['HELL_BOY']<module&nbsp;'posixpath'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>>>>&nbsp;globals()['HELL_BOY']<module&nbsp;'posixpath'&nbsp;from&nbsp;/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>>并没有定义路径:>>>&nbsp;globals()['path']Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last): &nbsp;File&nbsp;"<stdin>",&nbsp;line&nbsp;1,&nbsp;in&nbsp;<module>KeyError:&nbsp;'path'>>>关于使用的一个陷阱&nbsp;fromname从两个不同的模块导入时:>>>&nbsp;import&nbsp;sys>>>&nbsp;from&nbsp;os&nbsp;import&nbsp;stat>>>&nbsp;locals()['stat']<built-in&nbsp;function&nbsp;stat>>>>>>>&nbsp;stat<built-in&nbsp;function&nbsp;stat>shutil再次导入stat&nbsp;:>>>>>>&nbsp;from&nbsp;shutil&nbsp;import&nbsp;stat>>>&nbsp;locals()['stat']<module&nbsp;'stat'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>>>>&nbsp;stat<module&nbsp;'stat'&nbsp;from&nbsp;'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>>>>最后的进口将赢得胜利
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python