python中from module import * 的一個(gè)坑
但還有另外一個(gè)問題 - 你以為你修改了某個(gè)變量,其實(shí),被from module import *后的那個(gè)并沒有被更新,非常危險(xiǎn),因?yàn)槌绦蛴锌赡苓€可以正常運(yùn)行, 只不過結(jié)果錯(cuò)了,到了production才被發(fā)現(xiàn)就比較慘了。
舉個(gè)例子:
你定義了一些變量在base模塊中:
# reference data type class Demo: def __init__(self, name): self.name = name demo = Demo('Demo') # primitive type foo = 1
然后在一個(gè)模塊中用from module import 的方式讀它:
from base import * def read(): print 'reference data id: ' + str(id(demo)) print 'reference data value : ' + demo.name print 'primitive data id: ' + str(id(foo)) print 'primitive data value: ' + str(foo)
在另外一個(gè)模塊中寫它:
import base def write(): print "\nOriginal:" print "Original reference data id: " + str(id(base.demo)) base.demo.name = "Updated Demo" # this will reflect that change #base.demo = base.Demo("Updated Demo") # this won't relfect the change print "Original data id: " + str(id(base.foo)) base.foo = 1000 print "Original data id after assignment: " + str(id(base.foo))
然后先寫,后讀,看寫的內(nèi)容是否有效:
import read import write print "before write" read.read() write.write() print "\nafter write" read.read()
結(jié)論是沒有,原因是:
當(dāng)你用from module import時(shí),其實(shí)是copy了一份reference或者pointer,指向一份內(nèi)存,var和module.var都指向同一份內(nèi)存
當(dāng)你修改module.var時(shí),其實(shí)你是讓它指向了另外一份內(nèi)存,此時(shí)var和module.var指向的是不同的內(nèi)存
所以,雖然module.var的值變了,var還是指向原來那份內(nèi)存,原來的值
這個(gè)對于object,比較容易理解,你可以直接修改object里的值,這個(gè)是有效的,但是當(dāng)你指向另外一個(gè)object時(shí)就無效了。 對于primitive類型來講,其實(shí)也是一個(gè)道理,因?yàn)槊看钨x值,都是讓其指向一個(gè)不同的內(nèi)存地址,而不是inplace修改已有的那份內(nèi)存 - 這個(gè)很容易驗(yàn)證:
In [1]: a = 10 In [2]: id(a) Out[2]: 20429204 In [3]: a = 100 In [4]: id(a) Out[4]: 20430108
所以,建議是除非是一個(gè)quick and dirty的腳本,否則不要使用from module import *!
例子: https://github.com/baiyanhuang/blog/tree/master/arena/python/from_module_import
相關(guān)文章
python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Python?自動控制原理?control的詳細(xì)解說
這篇文章主要介紹了Python自動控制原理control的詳細(xì)解說,文章圍繞主題展開對Python?control的介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07Python基礎(chǔ)必備之語法結(jié)構(gòu)詳解
Python語法定義了用于在 Python 編程中創(chuàng)建句子的所有規(guī)則集。如果想更深入地研究 Python 詞法結(jié)構(gòu),需要了解構(gòu)成語句的句法元素,即構(gòu)成 Python 程序的基本單元,涵蓋控制結(jié)構(gòu),在不同代碼組之間引導(dǎo)程序流的構(gòu)造,快跟隨小編一起學(xué)習(xí)一下吧2022-04-04python實(shí)現(xiàn)在目錄中查找指定文件的方法
這篇文章主要介紹了python實(shí)現(xiàn)在目錄中查找指定文件的方法,通過模糊查找與精確查找兩個(gè)實(shí)例較為詳細(xì)的闡述了文件查找的方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11python實(shí)現(xiàn)音樂播放和下載小程序功能
這篇文章主要介紹了python實(shí)現(xiàn)音樂播放和下載小程序功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04