朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写(有时候有空也会参与编写),所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
为了丰富学员们的课外知识,老师让我们助理分享这套Python系列教程。由于Python教程并非老师所写,所以不如老师的AI教学风趣幽默,望大家见谅!(有时老师也会参与编写)。想要学习AI技术的新朋友可以去www.captainbed.cn。本公众号由助理负责运营,只免费分享课外知识,不回复任何私信。PS:看不懂本篇文章的同学请从前面的文章看起,循序渐进每天学一点就不会觉得难了!
在前面的文章中,我就表明了态度,推荐大家直接使用import,尽量少用from。因为from语句是Python中各种潜在陷阱的源头。
from语句其实是在导入者的作用域内对变量名的赋值语句,也就是变量名拷贝运算,而不是变量名的别名机制。这句话很难理解哦!下面我举个栗子大家就明白了。
假设我们定义了下列模块(nested1.py)。
# nested1.py
X = 99
def printer(): print(X)
如果我们在另一个模块内(nested2.py)使用from导入变量,就会得到变量的拷贝,而不是对变量的连接。在导入者内修改变量,只会重设该变量在本地作用域的绑定值,而不是nested1.py中的变量:
# nested2.py
from nested1 import X,printer # Copy names out
X = 88 # Changes my "X" only!
printer() # nested1's X is still 99
% python nested2.py
99
再举一个更加通俗易懂的例子。就像你在一个全国联网的相亲系统中只是单纯修改了本地的信息一样,全国联网的数据库中的信息依然是旧的。
from 相亲资料库 import 年龄, 查看资料
年龄 = 18 # 偷偷把自己年龄改小
查看资料() # 结果还是显示真实年龄99岁!
然而,如果我们使用import导入了整个模块,然后赋值某个点号运算的变量,这样就会修改nested1.py中的变量。点号运算把Python定向到了模块对象内的变量,而不是导入者的变量(nested3.py)。
# nested3.py
import nested1 # Get module as a whole
nested1.X = 88 # OK: change nested1's X
nested1.printer()
% python nested3.py
88
由于上面所说的特性,会引发一个与reload相关的陷阱:正如前边讨论过的那样,from在执行时会复制变量,不会直接连接到变量。reload重载被导入者时,对于使用from导入模块变量的导入者没有影响。也就是说,导入者的变量依然引用了通过from取出的旧变量,看下面的代码可以帮助你理解:
from module import X # X may not reflect any module reloads!
...
from imp import reload
reload(module) # Changes module,but not my names
X # 这个变量依然是之前的旧版本,而不是reload后的新版本
用from导入的旧情人,就像分手后还永远活在回忆里不肯更新:
from 前任 import 温柔体贴
reload(前任) # 对方已经变成霸道总裁
print(温柔体贴) # 输出结果还是记忆中的样子
为了保证reload重载更有效,建议使用import以及点号运算,来取代from。因为点号运算总是会回到模块,这样就会找到模块重载后变量的新的绑定值。
import module # Get module,not names
...
from imp import reload
reload(module) # Changes module in-place
module.X # Get current X: reflects module reloads
湿人云: 好的代码关系,就像穿着衣服的import,看似保持距离,实则深入“连接”,就像X站的clothed标签。