Python新手如何理解迴圈載入模組

2022-10-06 04:15:13 字數 1613 閱讀 9257

迴圈載入模組

假設你有兩個檔案,a.py和b.py,在這兩個檔案中互相載入對方,例如:

在a.py中:

import b

def f():

return b.x

print f()

在b.py中:

import a

x = 1

def g():

print a.f()

首先,我們試著載入a.py:

>>> import a

1沒有問題。也許讓人吃驚,畢竟有個感覺應該是問題的迴圈載入在這兒。

事實上在python中僅僅是表面上的出現迴圈載入並不是什麼問題。如果乙個模組以及被載入了,python不會傻到再去重新載入一遍。但是,當每個模組都想要互相訪問定義在對方裡的函式或者變數時,問題就來了。

讓我們再回到之前的例子,當我們載入a.py時,它再載入b.py不會有問題,因為在載入b.py時,它並不需要訪問a.py的任何東西,而在b.py中唯一的引用就是呼叫a.f()。但是這個呼叫是在函式g()中完成的,並且a.py或者b.py中沒有人呼叫g(),所以這會兒心情還是美麗的。

但是當我們試圖載入b.**gkwmpy時(之前沒有載入a.py),會發生什麼呢:

>>> import b

traceback (most recent call last):

f**gkwmile "", line 1, in

file "b.py", line 1, in

import a

file "a.py", line 6, in 程式設計客棧》

print f()

file "a.py", line 4, in f

return b.x

attributeerror: 'module' object has no attribute 'x'

恭喜你,出錯了。這裡問題出在載入b.py的過程中,python試圖載入a.py,並且在a.py中需要呼叫到f(),而函式f()又要訪問到b.x,但是這個時候b.x卻還沒有被定義。這就產生了attributeerror異常。

解決的方案可以做一點細微的改動。改一下b.py,使得它在g()裡面載入a.py:

www.cppcns.comx = 1

def g():

import a

# 只有當g()被呼叫的時候才載入

print a.f()

這會兒當我們載入b.py的時候,一切安好:

>&> import b

>>> b.g()

1 # 第一次輸出,因為模組a在最後呼叫了『print f()'

1 # 第二次輸出,這是我們呼叫g()

知識點擴充:

1、使用系統函式__import_()

stringmodule = __import__('string')

2、使用imp 模組

import imp

stringmodule = imp.load_module('string',*imp.find_module('string'))

3、使用exec

import_string = "import string as stringmodule"

exec import_string

Python 迴圈結構 新手向

while 條 語句 gif例項 break與continue語句 break 結束整個for迴圈 如果是迴圈巢狀情況就結束內迴圈,進入下一次外迴圈 continue 結束當前迴圈,進入下乙個迴圈 比如在第二次迴圈時讀到continue時,會直接結束第二次迴圈,進行第三次迴圈 n 0while n ...

如何理解python中while的迴圈巢狀

row 1while row 5 col 1while col row print end col 1print row 1上面的這個 執行完之後,列印出來的是這樣的 我當時學while巢狀迴圈時,不理解上面的這個 全部執行完之後的結果 為什麼能夠在列印第n行時能夠在第n行列印n個 後來我發現原來是...

python中if語句加while迴圈猜年齡遊戲

while迴圈語法 while 條件 print if語句就是判斷條件,兩者結合後就可以寫猜年齡遊戲 age1 25 定乙個正確年齡 guess true 定乙個變數為真 while guess 為真時執行下面語句 in age int input 輸入年齡 手輸年齡 if in age age1 ...