python from和import的区别,Python 中 import 与 from-import 的区别

起因

在学习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 输出的结果为

 
 

this is a.py

this is b.py

this is b.foo

修改b.py为from a import *

from a import *

def foo():

print 'this is b.foo'

print 'this is b.py'

foo()

运行b.py 输出的结果仍然为

 
 

this is a.py

this is b.py

this is b.foo

感觉不可能这么没有道理, 没有任何区别

但是当在b.py调用a.foo()时, 就出现问题了

from a import *

def foo():

print 'this is b.foo'

print 'this is b.py'

a.foo()

 
 

this is a.py

this is b.py

Traceback (most recent call last):

File "b.py", line 5, in

a.foo()

NameError: name 'a' is not defined

报错结果为a并没有被定义, 这样一下就豁然开朗了

其实这是一个名称空间与变量作用域的问题(名称空间是名称到对象的映射,Python在程序执行期间会有两个或三个活动的名称空间.分别是巨擘名称空间,全局名称空间和内建名称空间, 当然这一说就多了, 这里就不细说了)

结论

 
 

import a

from a import *

相同点

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

不同点

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

import a

调用a.py中的foo函数

a.foo()

foo属于名称空间a

from a import *

调用a.py中的foo函数

foo()

foo就属于当前作用域, 访问foo函数不需要加入a名称

拓展

以下两种方式

 
 

from a import *

from a import foo

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值