概要:大部分情况下两种导库方式from xxx import xxx和import xxx这两种方式并无区别,除非你想要修改导入模块内的变量。
在python中,有两种导库方式:from xxx import xxx和import xxx。对于大多数情况下,它们的区别只有要不要用xxx.aaa来访问库里面的变量的函数,但是当我们想要修改导入库内的变量时,就会陷入一个很离奇的问题,示例如下。
我们首先定义一个测试库,aaa.py:
a = 1
def changeA():
global a
a = 2
再在bbb.py里导入它:
from aaa import *
print(a) # 输出 1
changeA() # 修改 a 的值
print(a) # 应该输出 2
这里本应该输出
1
2
但是实际上输出了
1
1
这就是from语句的特性:只会一次性创建模块变量的引用。也就是说,bbb.py中的变量a
是aaa.a
的引用,而当调用changeA函数时,引用并不会更新,需要我们使用import语句实时调用aaa里面的变量。有点不好理解?看下面的示例:
from aaa import *
import aaa
print(a, id(a), aaa.a, id(aaa.a))
changeA()
print(a, id(a), aaa.a, id(aaa.a))
输出:
1 140727098794792 1 140727098794792
1 140727098794792 2 140727098794824
这证明了使用from导库的时候变量只会被导入一次,而import的方法可以实时更新导入的值。
总结:当要修改导入库的变量时,应使用import xxx的形式来实时更新变量,否则变量无法被更新导致出现问题。