欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中from module import * 的一個(gè)坑

 更新時(shí)間:2014年07月20日 15:32:28   投稿:hebedich  
from module import *把module中的成員全部導(dǎo)到了當(dāng)前的global namespace,訪問起來就比較方便了。當(dāng)然,python style一般不建議這么做,因?yàn)榭赡芤餹ame conflict。

但還有另外一個(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ù)庫

    python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了python3.4用函數(shù)操作mysql5.7數(shù)據(jù)庫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Python?自動控制原理?control的詳細(xì)解說

    Python?自動控制原理?control的詳細(xì)解說

    這篇文章主要介紹了Python自動控制原理control的詳細(xì)解說,文章圍繞主題展開對Python?control的介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python基礎(chǔ)必備之語法結(jié)構(gòu)詳解

    Python基礎(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-04
  • 一文介紹Python中的正則表達(dá)式用法

    一文介紹Python中的正則表達(dá)式用法

    正則表達(dá)式是一種強(qiáng)大的文本匹配和處理工具,廣泛應(yīng)用于各種編程語言中,在Python中,我們可以使用內(nèi)置的re模塊來處理正則表達(dá)式,本文將帶您從入門到精通,逐步介紹Python中的正則表達(dá)式用法,并提供實(shí)例演示
    2023-07-07
  • Python實(shí)現(xiàn)中英文全文搜索的示例

    Python實(shí)現(xiàn)中英文全文搜索的示例

    這篇文章主要介紹了Python實(shí)現(xiàn)中英文全文搜索的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • python的函數(shù)形參和返回值你了解嗎

    python的函數(shù)形參和返回值你了解嗎

    這篇文章主要為大家詳細(xì)介紹了python的函數(shù)形參和返回值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • python實(shí)現(xiàn)在目錄中查找指定文件的方法

    python實(shí)現(xiàn)在目錄中查找指定文件的方法

    這篇文章主要介紹了python實(shí)現(xiàn)在目錄中查找指定文件的方法,通過模糊查找與精確查找兩個(gè)實(shí)例較為詳細(xì)的闡述了文件查找的方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • python實(shí)現(xiàn)音樂播放和下載小程序功能

    python實(shí)現(xiàn)音樂播放和下載小程序功能

    這篇文章主要介紹了python實(shí)現(xiàn)音樂播放和下載小程序功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 如何在Windows中安裝多個(gè)python解釋器

    如何在Windows中安裝多個(gè)python解釋器

    這篇文章主要介紹了如何在Windows中安裝多個(gè)python解釋器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python中的逆序遍歷實(shí)例

    python中的逆序遍歷實(shí)例

    今天小編就為大家分享一篇python中的逆序遍歷實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論