1.1 變量要先賦值再引用
描述
python導(dǎo)入模塊時(shí)從上到下執(zhí)行不在函數(shù)內(nèi)、不在類內(nèi)的代碼。
NO | 類型 | 描述 |
---|---|---|
1 | 頂層代碼 | 不在函數(shù)內(nèi)、不在類內(nèi)的代碼會(huì)立刻執(zhí)行,無(wú)法引用后面位置賦值的變量名。所以被引用的變量要在前面位置進(jìn)行賦值。比如,def定義函數(shù)要寫(xiě)在調(diào)用函數(shù)的前面。 |
2 | 非頂層代碼 | 在函數(shù)內(nèi)、在類內(nèi)的代碼,被調(diào)用的時(shí)候才會(huì)執(zhí)行。 |
文件內(nèi)容
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='梯閱線條'
示例
# 打開(kāi)cmd 執(zhí)行下面示例
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()
# 執(zhí)行到第2行的 func_a() 報(bào)錯(cuò),未定義
NameError: name 'func_a' is not defined
# 注釋掉第2行的 func_a(),再次執(zhí)行
>>> 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()
# 執(zhí)行到第8行調(diào)用 func_a() ,第6行 調(diào)用 func_b(),報(bào)錯(cuò)未定義
NameError: name 'func_b' is not defined
# 注釋掉第8行的 func_a(),再次執(zhí)行
>>> 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)
# 調(diào)用func_b()訪問(wèn)s時(shí),報(bào)錯(cuò)s未定義
NameError: name 's' is not defined
# 注釋掉第14行的 func_a(),在s=’梯閱線條’的下面語(yǔ)句調(diào)用func_a(),再次執(zhí)行
>>> import testvar
run func_a
run func_b
梯閱線條
1.2 from復(fù)制變量而非別名
描述
from語(yǔ)句復(fù)制被導(dǎo)入的變量到導(dǎo)入模塊,而非取變量別名。在導(dǎo)入模塊修改變量值,不會(huì)更新被導(dǎo)入模塊的變量值。
import module,通過(guò)module.X=Y修改變量值,會(huì)更新被導(dǎo)入模塊的變量值。
文件內(nèi)容
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()
示例
# 打開(kāi)cmd 執(zhí)行下面示例
E:\\documents\\F盤>python testfrom2.py
# testfrom2.py修改s=’tyxt’,不影響testfrom1.py的s的值。
梯閱線條
E:\\documents\\F盤>python testfrom3.py
# testfrom1.s=’tyxt’,會(huì)更新testfrom1.py的s值。
tyxt
1.3 reload不更新from客戶端
描述
(1) from module import X,不會(huì)將module復(fù)制到當(dāng)前模塊,不可訪問(wèn)module,不可reload(module)。
(2) from module import X導(dǎo)入方式,需import module,再reload(module),最后from module import X,才會(huì)更新最新代碼。【需import module,再reload(module),這個(gè)可以合并為reload(sys.modules[‘module’])實(shí)現(xiàn),因?yàn)閒rom module會(huì)緩存到sys.modules字典】
(3) import module導(dǎo)入方式,可以直接reload(module)更新最新代碼。
文件內(nèi)容
E**:**\\documents\\F盤\\testreloadfrom1.py
s='梯閱線條'
#s='tyxt'
E**:**\\documents\\F盤\\testreloadfrom2.py
from testreloadfrom1 import s
from importlib import reload
reload(testreloadfrom1)
示例
# 打開(kāi)cmd 執(zhí)行下面示例
E:\\documents\\F盤>python testreloadfrom2.py
Traceback (most recent call last):
File "testreloadfrom2.py", line 3, in
reload(testreloadfrom1)
# from module import X,不可訪問(wèn)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 不可訪問(wèn)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仍然沒(méi)有更新
>>> s
'梯閱線條'
# 需重新from M import X , s 才會(huì)更新
>>> from testreloadfrom1 import s
>>> s
'tyxt'
>>> exit()
# 通過(guò)import module 進(jìn)行reload
E:\\documents\\F盤>python
>>> import testreloadfrom1
>>> testreloadfrom1.s
'tyxt'
# 修改testreloadfrom1.py的s=’梯閱線條’
>>> from importlib import reload
# 只需reload被導(dǎo)入模塊即可
>>> reload(testreloadfrom1)
'testreloadfrom1' from 'E:\\\\documents\\\\F盤\\\\testreloadfrom1.py'>
# s有更新
>>> testreloadfrom1.s
'梯閱線條'
>>> exit()
# 通過(guò)reload(sys.modules[‘M’])對(duì)from M import X進(jìn)行重載
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避免使用遞歸導(dǎo)入
描述
模塊A導(dǎo)入模塊B,模塊B又導(dǎo)入模塊A,這種情況稱為遞歸導(dǎo)入。應(yīng)該避免使用遞歸導(dǎo)入。如必須遞歸導(dǎo)入可以使用import M,而不使用from M import X。
文件內(nèi)容
E**:**\\documents\\F盤\\testmoda.py
S='梯閱線條'
import testmodb
N=9555
E**:**\\documents\\F盤\\testmoda.py
from testmoda import S
from testmoda import N
示例
# 打開(kāi)cmd 執(zhí)行下面示例
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執(zhí)行到import testmodb時(shí),
# 從testmoda導(dǎo)入S成功,但是,從testmoda導(dǎo)入N失敗,
# 因?yàn)榇藭r(shí)testmoda還沒(méi)執(zhí)行完import testmodb,無(wú)法往下執(zhí)行 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
# 通過(guò)import M進(jìn)行遞歸導(dǎo)入可以正常訪問(wèn)。
>>> testmoda.testmodb
'testmodb' from 'E:\\\\documents\\\\F盤\\\\testmodb.py'>
>>> testmoda.testmodb.testmoda.S
'梯閱線條'
>>> testmoda.testmodb.testmoda.N
9555
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4277瀏覽量
62323 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68231 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論