python中from module import * 的一個坑
但還有另外一個問題 - 你以為你修改了某個變量,其實,被from module import *后的那個并沒有被更新,非常危險,因為程序有可能還可以正常運行, 只不過結(jié)果錯了,到了production才被發(fā)現(xiàn)就比較慘了。
舉個例子:
你定義了一些變量在base模塊中:
# reference data type
class Demo:
def __init__(self, name):
self.name = name
demo = Demo('Demo')
# primitive type
foo = 1
然后在一個模塊中用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)
在另外一個模塊中寫它:
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時,其實是copy了一份reference或者pointer,指向一份內(nèi)存,var和module.var都指向同一份內(nèi)存
當(dāng)你修改module.var時,其實你是讓它指向了另外一份內(nèi)存,此時var和module.var指向的是不同的內(nèi)存
所以,雖然module.var的值變了,var還是指向原來那份內(nèi)存,原來的值
這個對于object,比較容易理解,你可以直接修改object里的值,這個是有效的,但是當(dāng)你指向另外一個object時就無效了。 對于primitive類型來講,其實也是一個道理,因為每次賦值,都是讓其指向一個不同的內(nèi)存地址,而不是inplace修改已有的那份內(nèi)存 - 這個很容易驗證:
In [1]: a = 10 In [2]: id(a) Out[2]: 20429204 In [3]: a = 100 In [4]: id(a) Out[4]: 20430108
所以,建議是除非是一個quick and dirty的腳本,否則不要使用from module import *!
例子: https://github.com/baiyanhuang/blog/tree/master/arena/python/from_module_import
- python中import,from……import的使用詳解
- Python上級目錄文件導(dǎo)入的幾種方法(from.import)
- python中import和from-import的區(qū)別解析
- python中的import、from import及import as的區(qū)別解析
- python3中_from...import...與import?...之間的區(qū)別詳解(包/模塊)
- Python import與from import使用和區(qū)別解讀
- python中import與from方法總結(jié)(推薦)
- 詳解Python中的from..import絕對導(dǎo)入語句
- Python中from…import *和import區(qū)別小結(jié)
相關(guān)文章
Pycharm使用時會出現(xiàn)的問題之cv2無法安裝解決
這篇文章主要介紹了Pycharm使用時會出現(xiàn)的問題之cv2無法安裝解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
python實踐項目之監(jiān)控當(dāng)前聯(lián)網(wǎng)狀態(tài)詳情
介紹一個利用Python監(jiān)控當(dāng)前聯(lián)網(wǎng)狀態(tài)情況的python代碼,它可以清楚地知道,你的電腦網(wǎng)絡(luò)是否是鏈接成功或失敗,下面小編帶大家來一起學(xué)習(xí)它2019-05-05
如何在Windows環(huán)境下安裝PyMySQL(已安裝Anaconda)
這篇文章主要介紹了如何在Windows環(huán)境下安裝PyMySQL問題(已安裝Anaconda),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Python3環(huán)境安裝Scrapy爬蟲框架過程及常見錯誤
這篇文章主要介紹了Python3環(huán)境安裝Scrapy爬蟲框架過程及常見錯誤 ,本文給大家介紹的非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
python元組和字典的內(nèi)建函數(shù)實例詳解
這篇文章主要介紹了python元組和字典的內(nèi)建函數(shù),結(jié)合實例形式詳細分析了Python元組和字典的各種常見內(nèi)建函數(shù)功能與相關(guān)使用技巧,需要的朋友可以參考下2019-10-10

