最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中from module import * 的一個坑

 更新時間:2014年07月20日 15:32:28   投稿:hebedich  
from module import *把module中的成員全部導到了當前的global namespace,訪問起來就比較方便了。當然,python style一般不建議這么做,因為可能引起name conflict。

但還有另外一個問題 - 你以為你修改了某個變量,其實,被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é)論是沒有,原因是:

當你用from module import時,其實是copy了一份reference或者pointer,指向一份內(nèi)存,var和module.var都指向同一份內(nèi)存
當你修改module.var時,其實你是讓它指向了另外一份內(nèi)存,此時var和module.var指向的是不同的內(nèi)存
所以,雖然module.var的值變了,var還是指向原來那份內(nèi)存,原來的值
這個對于object,比較容易理解,你可以直接修改object里的值,這個是有效的,但是當你指向另外一個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

相關(guān)文章

  • Pycharm使用時會出現(xiàn)的問題之cv2無法安裝解決

    Pycharm使用時會出現(xiàn)的問題之cv2無法安裝解決

    這篇文章主要介紹了Pycharm使用時會出現(xiàn)的問題之cv2無法安裝解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何利用Python實現(xiàn)簡單C++程序范圍分析

    如何利用Python實現(xiàn)簡單C++程序范圍分析

    這篇文章主要介紹了如何利用Python實現(xiàn)簡單C++程序范圍分析,文章以舉例說明及過程實現(xiàn)思路的方式展開講解,具有一定的的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • python 自定義異常和異常捕捉的方法

    python 自定義異常和異常捕捉的方法

    今天小編就為大家分享一篇python 自定義異常和異常捕捉的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python實踐項目之監(jiān)控當前聯(lián)網(wǎng)狀態(tài)詳情

    python實踐項目之監(jiān)控當前聯(lián)網(wǎng)狀態(tài)詳情

    介紹一個利用Python監(jiān)控當前聯(lián)網(wǎng)狀態(tài)情況的python代碼,它可以清楚地知道,你的電腦網(wǎng)絡(luò)是否是鏈接成功或失敗,下面小編帶大家來一起學習它
    2019-05-05
  • 基于Python編寫一個點名器的示例代碼

    基于Python編寫一個點名器的示例代碼

    想起小學的時候老師想點名找小伙伴回答問題的時候,老師竟斥巨資買了個點名器。今日無聊便敲了敲小時候老師斥巨資買的點名器,希望對大家有幫助
    2022-07-07
  • 如何在Windows環(huán)境下安裝PyMySQL(已安裝Anaconda)

    如何在Windows環(huán)境下安裝PyMySQL(已安裝Anaconda)

    這篇文章主要介紹了如何在Windows環(huán)境下安裝PyMySQL問題(已安裝Anaconda),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python3環(huán)境安裝Scrapy爬蟲框架過程及常見錯誤

    Python3環(huán)境安裝Scrapy爬蟲框架過程及常見錯誤

    這篇文章主要介紹了Python3環(huán)境安裝Scrapy爬蟲框架過程及常見錯誤 ,本文給大家介紹的非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • python中內(nèi)置函數(shù)range詳解

    python中內(nèi)置函數(shù)range詳解

    Python內(nèi)置函數(shù)range()是一個用于生成一系列連續(xù)的整數(shù)的函數(shù),它常用于循環(huán)結(jié)構(gòu)中,用于指定循環(huán)的次數(shù)或迭代的范圍,這篇文章主要介紹了python之內(nèi)置函數(shù)range,需要的朋友可以參考下
    2023-07-07
  • python元組和字典的內(nèi)建函數(shù)實例詳解

    python元組和字典的內(nèi)建函數(shù)實例詳解

    這篇文章主要介紹了python元組和字典的內(nèi)建函數(shù),結(jié)合實例形式詳細分析了Python元組和字典的各種常見內(nèi)建函數(shù)功能與相關(guān)使用技巧,需要的朋友可以參考下
    2019-10-10
  • 使用Python檢查CPU型號并彈出警告信息

    使用Python檢查CPU型號并彈出警告信息

    本教程將指導你如何編寫一個Python程序,該程序能夠在啟動時檢查計算機的CPU型號,如果檢測到CPU型號包含“I3”,則會彈出一個警告窗口,感興趣的小伙伴跟著小編一起來看看吧
    2024-12-12

最新評論

囊谦县| 秦皇岛市| 白沙| 田阳县| 新竹市| 大港区| 浑源县| 海宁市| 丹江口市| 永川市| 白朗县| 青龙| 固安县| 时尚| 左云县| 曲周县| 噶尔县| 怀集县| 济宁市| 淮滨县| 化德县| 德钦县| 蕲春县| 张家口市| 赤水市| 白城市| 民和| 仁化县| 神农架林区| 托克逊县| 舞钢市| 彰化县| 孟州市| 工布江达县| 临城县| 綦江县| 沽源县| 浠水县| 格尔木市| 辉南县| 来凤县|