美文网首页
Python 中 import 与 from-import 的区

Python 中 import 与 from-import 的区

作者: 百分之百的大风 | 来源:发表于2016-09-20 13:25 被阅读525次

    起因

    在学习Python的过程中好奇import xxx 与 from xxx

    寻找问题

    动手写了两个Pythonx程序a.py与b.py
    这是a.py

    #a.py
    def foo():
        print 'this is a.foo'
    print 'this is a.py'
    

    然后在b.py中我先这样写的

    #b.py
    import a
    def foo():
        print 'this is b.foo'
    print 'this is b.py'
    foo()
    

    运行b.py 输出的结果为
    <pre>
    this is a.py
    this is b.py
    this is b.foo
    </pre>
    修改b.py为from a import *

    from a import *
    def foo():
        print 'this is b.foo'
    print 'this is b.py'
    foo()
    

    运行b.py 输出的结果仍然
    <pre>
    this is a.py
    this is b.py
    this is b.foo
    </pre>
    感觉不可能这么没有道理, 没有任何区别
    但是当在b.py调用a.foo()时, 就出现问题了

    from a import *
    def foo():
        print 'this is b.foo'
    print 'this is b.py'
    a.foo()
    

    <pre>
    this is a.py
    this is b.py
    Traceback (most recent call last):
    File "b.py", line 5, in <module>
    a.foo()
    NameError: name 'a' is not defined
    </pre>
    报错结果为a并没有被定义, 这样一下就豁然开朗了
    其实这是一个名称空间与变量作用域的问题(名称空间是名称到对象的映射,Python在程序执行期间会有两个或三个活动的名称空间.分别是巨擘名称空间,全局名称空间和内建名称空间, 当然这一说就多了, 这里就不细说了)

    结论

    <pre>
    import a
    from a import *
    </pre>

    相同点

    两种导入方式中都会对a.py进行加载并执行

    不同点

    a.py中属性的作用域不同
    import a

    调用a.py中的foo函数
    <pre>a.foo()</pre>
    foo属于名称空间a

    from a import *

    调用a.py中的foo函数
    <pre>foo()</pre>
    foo就属于当前作用域, 访问foo函数不需要加入a名称

    拓展

    以下两种方式
    <pre>
    from a import *
    from a import foo
    </pre>
    对于第二种方式, a.py在导入时仍然会被加载并执行, 不同的是在b.py中只能调用a中的foo属性, 其他的属性都访问不了

    相关文章

      网友评论

          本文标题:Python 中 import 与 from-import 的区

          本文链接:https://www.haomeiwen.com/subject/gzhoettx.html