久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > Python導(dǎo)入模塊時(shí)的過程

        Python導(dǎo)入模塊時(shí)的過程

        來源:千鋒教育
        發(fā)布人:xqq
        時(shí)間: 2023-11-07 14:24:22 1699338262

        python的import是在程序運(yùn)行期間執(zhí)行的,并非像其它很多語言一樣是在編譯期間執(zhí)行。也就是說,import可以出現(xiàn)在任何地方,只有執(zhí)行到這個(gè)import行時(shí),才會執(zhí)行導(dǎo)入操作。且在import某個(gè)模塊之前,無法訪問這個(gè)模塊的屬性。

        python在import導(dǎo)入模塊時(shí),首先搜索模塊的路徑,然后編譯并執(zhí)行這個(gè)模塊文件。雖然概括起來只有兩個(gè)過程,但實(shí)際上很復(fù)雜。

        前文已經(jīng)解釋了import的模塊搜索過程,所以這里大概介紹import的其它細(xì)節(jié)。

        以前面的a.py中導(dǎo)入模塊文件b.py為例:

        importb

        import導(dǎo)入模塊時(shí),搜索到模塊文件b.py后:

        1.首先在內(nèi)存中為每個(gè)待導(dǎo)入的模塊構(gòu)建module類的實(shí)例:模塊對象。這個(gè)模塊對象目前是空對象,這個(gè)對象的名稱為全局變量b。

        注意細(xì)節(jié):module類的對象,變量b。

        輸出下它們就知道:

        print(b)

        print(type(b))

        輸出結(jié)果:

        因?yàn)閎是全局變量,所以當(dāng)前程序文件a.py中不能重新對全局變量b進(jìn)行賦值,這會使導(dǎo)入的模塊b被丟棄。例如,下面是錯(cuò)誤的:

        importb

        b=3

        print(b.x)#已經(jīng)沒有模塊b了

        另外,因?yàn)閕mport導(dǎo)入時(shí)是將模塊對象賦值給模塊變量,所以模塊變量名不能是python中的一些關(guān)鍵字,比如if、for等,這時(shí)會報(bào)錯(cuò)。雖然模塊文件名可以為list、keys等這樣的內(nèi)置函數(shù)名,但這會導(dǎo)致這些內(nèi)置函數(shù)不可用,因?yàn)楦鶕?jù)變量查找的作用域規(guī)則,首先查找全局變量,再查找內(nèi)置作用域。也就是說,模塊文件的文件名不能是這些關(guān)鍵字、也不應(yīng)該是這些內(nèi)置函數(shù)名。

        File"g:/pycode/new.py",line11

        importif

        ^

        SyntaxError:invalidsyntax

        2.構(gòu)造空模塊實(shí)例后,將編譯、執(zhí)行模塊文件b.py,并按照一定的規(guī)則將一些結(jié)果放進(jìn)這個(gè)模塊對象中。

        注意細(xì)節(jié),編譯、執(zhí)行b.py、將結(jié)果保存到模塊對象中。

        模塊第一次被導(dǎo)入的時(shí)候,會進(jìn)行編譯,并生成.pyc字節(jié)碼文件,然后python執(zhí)行這個(gè)pyc文件。當(dāng)模塊被再次導(dǎo)入時(shí),如果檢查到pyc文件的存在,且和源代碼文件的上一次修改時(shí)間戳mtime完全對應(yīng)(也就是說,編譯后源代碼沒有進(jìn)行過修改),則直接裝載這個(gè)pyc文件并執(zhí)行,不會再進(jìn)行額外的編譯過程。當(dāng)然,如果修改過源代碼,將會重新編譯得到新的pyc文件。

        注意,并非所有的py文件都會生成編譯得到的pyc文件,對于那些只執(zhí)行一次的程序文件,會將內(nèi)存中的編譯結(jié)果在執(zhí)行完成后直接丟棄(多數(shù)時(shí)候如此,但仍有例外,比如使用compileall模塊可以強(qiáng)制編譯成pyc文件),但模塊會將內(nèi)存中的編譯結(jié)果持久化到pyc文件中。另外,運(yùn)行字節(jié)碼pyc文件并不會比直接運(yùn)行py文件更快,執(zhí)行它也一樣是一行行地解釋、執(zhí)行,唯一快的地方在于導(dǎo)入裝載的時(shí)候無需重新編譯而已。

        執(zhí)行模塊文件(已完成編譯)的時(shí)候,按照一般的執(zhí)行流程執(zhí)行:一行一行地、以代碼塊為單元執(zhí)行。一般地,模塊文件中只用來聲明變量、函數(shù)等屬性,以便提供給導(dǎo)入它的模塊使用,而不應(yīng)該有其他任何操作性的行為,比如print()操作不應(yīng)該出現(xiàn)在模塊文件中,但這并非強(qiáng)制。

        總之,執(zhí)行完模塊文件后,這個(gè)模塊文件將有一個(gè)自己的全局名稱空間,在此模塊文件中定義的變量、函數(shù)等屬性,都會記錄在此名稱空間中。

        最后,模塊的這些屬性都會保存到模塊對象中。由于這個(gè)模塊對象賦值給了模塊變量b,所以通過變量b可以訪問到這個(gè)對象中的屬性(比如變量、函數(shù)等),也就是模塊文件內(nèi)定義的全局屬性。

        只導(dǎo)入一次

        假設(shè)a.py中導(dǎo)入了模塊b和模塊sys,在b.py中也導(dǎo)入了模塊sys,但python默認(rèn)對某個(gè)模塊只會導(dǎo)入一次,如果a.py中先導(dǎo)入sys,再導(dǎo)入b,那么導(dǎo)入b并執(zhí)行b.py的時(shí)候,會發(fā)現(xiàn)sys已經(jīng)導(dǎo)入了,不會再去導(dǎo)入sys。

        實(shí)際上,python執(zhí)行程序的時(shí)候,會將所有已經(jīng)導(dǎo)入的模塊放進(jìn)sys.module屬性中,這是一個(gè)dict,可以通過下面的方式查看已導(dǎo)入的模塊名:

        >>>importsys

        >>>list(sys.module.keys())

        如果某個(gè)程序文件中多次使用import(或from)導(dǎo)入同一個(gè)模塊,雖然不會報(bào)錯(cuò),但實(shí)際上還是直接使用內(nèi)存中已裝載好的模塊對象。

        例如,b.py中x=3,導(dǎo)入它之后修改該值,然后再次導(dǎo)入,發(fā)現(xiàn)b.x并不會發(fā)生改變:

        importb

        print(b.x)#3

        b.x=33

        print(b.x)#33

        importb

        print(b.x)#33

        但是python提供了reload進(jìn)行多次重復(fù)導(dǎo)入的方法,見后文。

        使用別名

        import導(dǎo)入時(shí),可以使用as關(guān)鍵字指定一個(gè)別名作為模塊對象的變量,例如:

        importbasbb

        bb.x=3

        print(bb.x)

        這時(shí)候模塊對象將賦值給變量bb,而不是b,b此時(shí)不再是模塊對象變量,而僅僅只是模塊名。使用別名并不會影響性能,因?yàn)樗鼉H僅只是一個(gè)賦值過程,只不過是從原來的賦值對象變量b變?yōu)樽兞縝b而已。

        以上內(nèi)容為大家介紹了Python導(dǎo)入模塊時(shí)的過程,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        列舉python常見的內(nèi)置函數(shù)

        abs()返回?cái)?shù)字的絕對值map根據(jù)函數(shù)對指定序列做映射map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是可迭代對象,map將傳入的函數(shù)依次作用到序列的每...詳情>>

        2023-11-07 17:02:46
        python內(nèi)置函數(shù):map、reduce、filter的用法和區(qū)別

        map:根據(jù)函數(shù)對指定序列做映射map參數(shù)接收兩個(gè)參數(shù):一個(gè)是函數(shù),一個(gè)是序列(可迭代對象)返回值Python2返回列表python3返回迭代器#例子:#abs()...詳情>>

        2023-11-07 16:59:10
        python虛擬環(huán)境工具virtualenv

        virtualenv是一個(gè)創(chuàng)建隔絕的Python環(huán)境的工具。virtualenv創(chuàng)建一個(gè)包含所有必要的可執(zhí)行文件的文件夾,用來使用Python工程所需的包。安裝pipins...詳情>>

        2023-11-07 16:30:22
        python函數(shù)調(diào)用和參數(shù)傳遞

        定義過函數(shù)后,就可以在后面程序中使用這一函數(shù)printsquare_sum(3,4)python通過位置,知道3對應(yīng)的是函數(shù)定義中的第一個(gè)參數(shù)a,4對應(yīng)第二個(gè)參數(shù)b...詳情>>

        2023-11-07 16:19:34
        python字節(jié)碼和機(jī)器碼的區(qū)別

        機(jī)器碼,學(xué)名機(jī)器語言指令,有時(shí)也被稱為原生碼,是電腦的CPU可直接解讀的數(shù)據(jù)。字節(jié)碼是一種中間狀態(tài)(中間碼)的二進(jìn)制代碼(文件)。需要直譯器...詳情>>

        2023-11-07 16:05:10
        增城市| 武城县| 丰县| 拉孜县| 沭阳县| 象州县| 威宁| 永和县| 苍山县| 武穴市| 平定县| 大姚县| 宁夏| 满洲里市| 太康县| 泰安市| 达拉特旗| 保亭| 柳江县| 鄂托克旗| 古蔺县| 铜川市| 丰宁| 黑河市| 鄱阳县| 通山县| 曲水县| 吴旗县| 云龙县| 贵港市| 芦溪县| 张家港市| 宁阳县| 大洼县| 平武县| 怀来县| 峨眉山市| 德化县| 黎川县| 莒南县| 麻江县|