Python 對象的賦值泛源、淺拷貝揍障、深拷貝

這是一則關(guān)于時間復(fù)雜度的思考引發(fā)的代碼瘦身案

由時間復(fù)雜度引出的思考與行動

之前看到這樣一段代碼:

class SequencePattern(object):
    def __init__(self, sequence, frequent):
        self.sequence = []
        for s in sequence:
            self._sequence.append(s)
        self.frequent = frequent

初始化后self._sequence的值與sequence的值相等,這段代碼沒有語法錯誤俩由;但我非常好奇毒嫡,既然如此,為什么要通過for循環(huán)來給self._sequence賦值幻梯,增加時間復(fù)雜度兜畸,而不直接使用self._sequence = sequence來賦值?這樣寫有什么好處碘梢?
于是咬摇,按照我的想法修改代碼如下:

class SequencePattern(object):
    def __init__(self, sequence, frequent):
        self.sequence = sequence
        self.frequent = frequent

我們來測試看看:

if __name__ == "__main__":
    seq, freq = [1, 2, 3], 2
    sp = SequencePattern(seq, freq)
    sp.sequence.append(4)
    print "sp.sequence:", sp.sequence
    print "seq:", seq

得到如下結(jié)果:

sp.sequence: [1, 2, 3, 4]
seq: [1, 2, 3, 4]

我只想修改sp實(shí)例的sequence屬性,并不想修改變量seq煞躬,那么變量seq為什么也被修改了呢肛鹏?這就涉及到了Python對象的賦值逸邦、拷貝等相關(guān)概念

Python對象的賦值、深拷貝在扰、淺拷貝

python中的變量存儲的是變量的地址缕减,而非變量的值

  • 賦值

復(fù)制原變量的地址,原變量與被賦值變量共享內(nèi)存地址芒珠,一個變量修改桥狡,另一個變量也會同時被修改

若a = [1,2,3],將a賦值給b皱卓,即b=a裹芝;這樣的賦值只是給對象[1,2,3]增加了一個引用,即a和b都指向?qū)ο骩1,2,3]的地址娜汁;若b.append(4)嫂易,則b=[1,2,3,4],且a=[1,2,3,4]

>>> a=[1,2,3]
>>> b=a
>>> b.append(4)
>>> print b
[1, 2, 3, 4]
>>> print a
[1, 2, 3, 4]
a.append(5)
>>> print b
[1, 2, 3, 4, 5]
>>> print a
[1, 2, 3, 4, 5]
  • 淺拷貝copy.copy()

對于復(fù)合對象而言掐禁,淺拷貝會新開辟一塊地址存放復(fù)制來的數(shù)據(jù)炬搭,但淺拷貝只能復(fù)制原變量最外層對象的數(shù)據(jù),對于深層的對象穆桂,只能復(fù)制其地址宫盔,不能復(fù)制其數(shù)據(jù)

>>> c = [6,7,8]
>>> d = [9,10,c]
>>> print d
[9, 10, [6, 7, 8]]
>>> e = copy.copy(d) #淺拷貝
>>> print d
[9, 10, [6, 7, 8]]
>>> print e
[9, 10, [6, 7, 8]]
# 外層對象的修改,互不影響
>>> d[0]=11
>>> e[0]=12
>>> print d
[11, 10, [6, 7, 8]]
>>> print e
[12, 10, [6, 7, 8]]
>>> print id(d)
4400860696
>>> print id(e)
4400861056
#d, e共用深層對象c的地址享完,所以c被修改后灼芭,d,e都會被修改
>>> c.append(13)
>>> print d
[11, 10, [6, 7, 8, 13]]
>>> print e
[12, 10, [6, 7, 8, 13]]
  • 深拷貝 copy.deepcopy()

復(fù)制原變量的所有數(shù)據(jù),原變量與被拷貝變量各自完全獨(dú)立般又,對一個變量的修改不會影響另一個變量

>>> f=copy.deepcopy(d) # f完全拷貝d的所有數(shù)據(jù)
>>> print d
[11, 10, [6, 7, 8, 13]]
>>> print f
[11, 10, [6, 7, 8, 13]]
#子對象的修改不影響新變量
>>> c.append(14)
>>> print d
[11, 10, [6, 7, 8, 13, 14]]
>>> print f
[11, 10, [6, 7, 8, 13]]

代碼瘦身

import copy
class SequencePattern(object):
    def __init__(self, sequence, frequent):
        self.sequence = copy.deepcopy(sequence)
        self.frequent = copy.deepcopy(frequent)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彼绷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茴迁,更是在濱河造成了極大的恐慌寄悯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堕义,死亡現(xiàn)場離奇詭異猜旬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)倦卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門洒擦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怕膛,你說我怎么就攤上這事熟嫩。” “怎么了褐捻?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵掸茅,是天一觀的道長椅邓。 經(jīng)常有香客問我,道長昧狮,這世上最難降的妖魔是什么景馁? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮陵且,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘个束。我一直安慰自己慕购,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布茬底。 她就那樣靜靜地躺著沪悲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阱表。 梳的紋絲不亂的頭發(fā)上殿如,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音最爬,去河邊找鬼涉馁。 笑死,一個胖子當(dāng)著我的面吹牛爱致,可吹牛的內(nèi)容都是我干的烤送。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼糠悯,長吁一口氣:“原來是場噩夢啊……” “哼帮坚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起互艾,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤试和,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纫普,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阅悍,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年昨稼,在試婚紗的時候發(fā)現(xiàn)自己被綠了溉箕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡悦昵,死狀恐怖肴茄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情但指,我是刑警寧澤寡痰,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布抗楔,位于F島的核電站,受9級特大地震影響拦坠,放射性物質(zhì)發(fā)生泄漏连躏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一贞滨、第九天 我趴在偏房一處隱蔽的房頂上張望入热。 院中可真熱鬧,春花似錦晓铆、人聲如沸勺良。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尚困。三九已至,卻和暖如春链蕊,著一層夾襖步出監(jiān)牢的瞬間事甜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工滔韵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻谦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓陪蜻,卻偏偏與公主長得像跨跨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子囱皿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361