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 testvar
Traceback (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 testvar
run func_a
Traceback (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_a
func_b()
# 执行到第8行调用 func_a() ,第6行 调用 func_b(),报错未定义
NameError: name 'func_b' is not defined
# 注释掉第8行的 func_a(),再次执行
>>> import testvar
run func_a
run func_b
Traceback (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_b
print(s)
# 调用func_b()访问s时,报错s未定义
NameError: name 's' is not defined
# 注释掉第14行的 func_a(),在s=’梯阅线条’的下面语句调用func_a(),再次执行
>>> import testvar
run func_a
run 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,myecho
s = 'tyxt'
myecho()
E**:**\\documents\\F盘\\testfrom3.py
import testfrom1
testfrom1.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值。
tyxt
1.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 s
from importlib import reload
reload(testreloadfrom1)
示例
# 打开cmd 执行下面示例
E:\\documents\\F盘>python testreloadfrom2.py
Traceback (most recent call last):
File "testreloadfrom2.py", line 3, in
reload(testreloadfrom1)
# from module import X,不可访问module
NameError: name 'testreloadfrom1' is not defined
E:\\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)
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
# s仍然没有更新
>>> s
'梯阅线条'
# 需重新from M import X , s 才会更新
>>> from testreloadfrom1 import s
>>> s
'tyxt'
>>> exit()
# 通过import module 进行reload
E:\\documents\\F盘>python
>>> import testreloadfrom1
>>> testreloadfrom1.s
'tyxt'
# 修改testreloadfrom1.py的s=’梯阅线条’
>>> from importlib import reload
# 只需reload被导入模块即可
>>> reload(testreloadfrom1)
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
# 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']
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
>>> from importlib import reload
>>> reload(sys.modules['testreloadfrom1'])
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
>>> 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 testmodb
N=9555
E**:**\\documents\\F盘\\testmoda.py
from testmoda import S
from testmoda import N
示例
# 打开cmd 执行下面示例
E:\\documents\\F盘>python
>>> import testmoda
Traceback (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=9555
ImportError: cannot import name 'N' from 'testmoda' (E:\\documents\\F盘\\testmoda.py)
>>> exit()
# 修改testmodb.py
#from testmoda import S
#from testmoda import N
import testmoda
#############
>>> import testmoda
>>> testmoda.S
'梯阅线条'
>>> testmoda.N
9555
# 通过import M进行递归导入可以正常访问。
>>> testmoda.testmodb
'testmodb' from 'E:\\\\documents\\\\F盘\\\\testmodb.py'>
>>> testmoda.testmodb.testmoda.S
'梯阅线条'
>>> testmoda.testmodb.testmoda.N
9555
-
函数
+关注
关注
3文章
4329浏览量
62576 -
代码
+关注
关注
30文章
4780浏览量
68539 -
python
+关注
关注
56文章
4793浏览量
84634
发布评论请先 登录
相关推荐
评论