1.1 变量要先赋值再引用描述
python导入模块时从上到下执行不在函数内、不在类内的代码。
no类型描述
1 顶层代码 不在函数内、不在类内的代码会立刻执行,无法引用后面位置赋值的变量名。所以被引用的变量要在前面位置进行赋值。比如,def定义函数要写在调用函数的前面。
2 非顶层代码 在函数内、在类内的代码,被调用的时候才会执行。
文件内容
e:\\documents\\f盘\\testvar.py
func_a()def func_a(): print('run func_a') func_b() func_a()def func_b(): print('run func_a') print(s)func_a()s='梯阅线条'示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python>>> import testvartraceback (most recent call last): file , line 1, in file e:\\documents\\f盘\\testvar.py, line 2, in func_a()# 执行到第2行的 func_a() 报错,未定义nameerror: name 'func_a' is not defined# 注释掉第2行的 func_a(),再次执行>>> import testvarrun func_atraceback (most recent call last): file , line 1, in file e:\\documents\\f盘\\testvar.py, line 8, in func_a() file e:\\documents\\f盘\\testvar.py, line 6, in func_afunc_b()# 执行到第8行调用 func_a() ,第6行 调用 func_b(),报错未定义nameerror: name 'func_b' is not defined# 注释掉第8行的 func_a(),再次执行>>> import testvarrun func_arun func_btraceback (most recent call last): file , line 1, in file e:\\documents\\f盘\\testvar.py, line 14, in func_a() file e:\\documents\\f盘\\testvar.py, line 6, in func_a func_b() file e:\\documents\\f盘\\testvar.py, line 12, in func_bprint(s)# 调用func_b()访问s时,报错s未定义nameerror: name 's' is not defined# 注释掉第14行的 func_a(),在s=’梯阅线条’的下面语句调用func_a(),再次执行>>> import testvarrun func_arun func_b梯阅线条1.2 from复制变量而非别名描述
from语句复制被导入的变量到导入模块,而非取变量别名。在导入模块修改变量值,不会更新被导入模块的变量值。
import module,通过module.x=y修改变量值,会更新被导入模块的变量值。
文件内容
e**:**\\documents\\f盘\\testfrom1.py
s='梯阅线条'def myecho(): print(s)e**:**\\documents\\f盘\\testfrom2.py
from testfrom1 import s,myechos = 'tyxt'myecho()e**:**\\documents\\f盘\\testfrom3.py
import testfrom1testfrom1.s = 'tyxt'testfrom1.myecho()示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python testfrom2.py# testfrom2.py修改s=’tyxt’,不影响testfrom1.py的s的值。梯阅线条e:\\documents\\f盘>python testfrom3.py# testfrom1.s=’tyxt’,会更新testfrom1.py的s值。tyxt1.3 reload不更新from客户端描述
(1) from module import x,不会将module复制到当前模块,不可访问module,不可reload(module)。
(2) from module import x导入方式,需import module,再reload(module),最后from module import x,才会更新最新代码。【需import module,再reload(module),这个可以合并为reload(sys.modules[‘module’])实现,因为from module会缓存到sys.modules字典】
(3) import module导入方式,可以直接reload(module)更新最新代码。
文件内容
e**:**\\documents\\f盘\\testreloadfrom1.py
s='梯阅线条'#s='tyxt'e**:**\\documents\\f盘\\testreloadfrom2.py
from testreloadfrom1 import sfrom importlib import reloadreload(testreloadfrom1)示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python testreloadfrom2.pytraceback (most recent call last): file testreloadfrom2.py, line 3, in reload(testreloadfrom1)# from module import x,不可访问modulenameerror: name 'testreloadfrom1' is not definede:\\documents\\f盘>python>>> from testreloadfrom1 import s>>> s'梯阅线条'# 修改testreloadfrom1.py的s=’tyxt’>>> from importlib import reload# from module 不可访问module>>> reload(testreloadfrom1)traceback (most recent call last): file , line 1, in nameerror: name 'testreloadfrom1' is not defined# 先import testrelaodfrom1>>> import testreloadfrom1>>> reload(testreloadfrom1)# s仍然没有更新>>> s'梯阅线条'# 需重新from m import x , s 才会更新>>> from testreloadfrom1 import s>>> s'tyxt'>>> exit()# 通过import module 进行reloade:\\documents\\f盘>python>>> import testreloadfrom1>>> testreloadfrom1.s'tyxt'# 修改testreloadfrom1.py的s=’梯阅线条’>>> from importlib import reload# 只需reload被导入模块即可>>> reload(testreloadfrom1)# s有更新>>> testreloadfrom1.s'梯阅线条'>>> exit()# 通过reload(sys.modules[‘m’])对from m import x进行重载e:\\documents\\f盘>python>>> from testreloadfrom1 import s>>> s'梯阅线条'# 修改testreloadfrom1.py的s=’tyxt’>>> import sys>>> sys.modules['testreloadfrom1']>>> from importlib import reload>>> reload(sys.modules['testreloadfrom1'])>>> s'梯阅线条'>>> from testreloadfrom1 import s>>> s'tyxt'1.4 python避免使用递归导入描述
模块a导入模块b,模块b又导入模块a,这种情况称为递归导入。应该避免使用递归导入。如必须递归导入可以使用import m,而不使用from m import x。
文件内容
e**:**\\documents\\f盘\\testmoda.py
s='梯阅线条'import testmodbn=9555e**:**\\documents\\f盘\\testmoda.py
from testmoda import sfrom testmoda import n示例
# 打开cmd 执行下面示例e:\\documents\\f盘>python>>> import testmodatraceback (most recent call last): file , line 1, in file e:\\documents\\f盘\\testmoda.py, line 2, in import testmodb file e:\\documents\\f盘\\testmodb.py, line 2, in from testmoda import n# testmoda.py执行到import testmodb时,# 从testmoda导入s成功,但是,从testmoda导入n失败,# 因为此时testmoda还没执行完import testmodb,无法往下执行 n=9555importerror: cannot import name 'n' from 'testmoda' (e:\\documents\\f盘\\testmoda.py)>>> exit()# 修改testmodb.py#from testmoda import s#from testmoda import nimport testmoda#############>>> import testmoda>>> testmoda.s'梯阅线条'>>> testmoda.n9555# 通过import m进行递归导入可以正常访问。>>> testmoda.testmodb>>> testmoda.testmodb.testmoda.s'梯阅线条'>>> testmoda.testmodb.testmoda.n9555
AGP插槽,什么是AGP插槽,AGP插槽外形图
机器学习算法的技巧分享
浅谈端子连接器的结构组成部件
受物联网、汽车电子行业的影响,8英寸晶圆产能呈载满状态产能吃紧
IPT015N10N5场效应管在四轮观光车电机控制中的应用
Python模块有哪些注意事项
日本神户钢铁造假显示出日本制造业也“失去的20年”
从功能到智能,汽车主动安全技术是未来发展重点
华为发布手表新专利,手背也能变成触控屏
美中贸易协定正式生效 科技公司将受到影响?
腾讯安全团队向Linux社区提交了多个NFC套接字资源泄露0day漏洞
基于Sonos的智能背景音乐解决方案介绍
Docker Hub遭黑客攻击,19万用户的数据遭泄露
台电跑分王M40首销仅27秒被抢光:平板电脑新贵或已到来
区块链长久发展的基础是什么
NB-IoT产业发展迎来新起点
32768晶振电路图大全(五款32768晶振电路图设计原理图详解)
微电机堵转对电机影响会有多大
张忠谋去年荣退后领了多少退休金,年报也给了答案:7,617万元
AI对于中国半导体业发展的现实意义