python內(nèi)存管理和拷貝

"""author = 陳俊龍"""

==============運(yùn)算符的重載==============

1. 運(yùn)算符

python中所以的數(shù)據(jù)類型本質(zhì)都是類扇谣,所以所有的數(shù)據(jù)本質(zhì)都是對(duì)象

使用運(yùn)算符對(duì)數(shù)據(jù)進(jìn)行操作的時(shí)候笨觅,實(shí)際是調(diào)用運(yùn)算符對(duì)應(yīng)的魔法方法

運(yùn)算符前面的數(shù)據(jù)類型決定了函數(shù)調(diào)用哪個(gè)類中對(duì)應(yīng)的魔法方法
10+20 # class int
'abc'+'123' # class str
[1, 2, 3]+[1] # class list

每個(gè)運(yùn)算符都有自己固定的魔法方法,看某種類型的數(shù)據(jù)是否支持某種運(yùn)算符就看這個(gè)類型中有沒有實(shí)現(xiàn)對(duì)應(yīng)的魔法方法
例如:
‘+’ -- _ add _
‘>’ -- _ gt _

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    # +號(hào)對(duì)應(yīng)的魔法方法,實(shí)現(xiàn)兩個(gè)對(duì)象求和
    def __add__(self, other):
        return self.age+other.age
    
# 定制乘法運(yùn)算,實(shí)現(xiàn)對(duì)象乘數(shù)字
    def __mul__(self, other):
        return self.age * other

    def __repr__(self):
        return '<%s>' % str(self.__dict__)[1:-1]

 # 定制比較運(yùn)算拘悦,實(shí)現(xiàn)對(duì)象成績(jī)的比較(比較多的情況)
    def __lt__(self, other):
        return self.score < other.score

    def __gt__(self, other):
        return self.score > other.score


stu1 = Student('小明', 18, 90)
stu2 = Student('小李', 18, 92)

print(stu1 == stu2)  # False  支持相等比較锋爪,其他的比較都不支持婆翔,如果需要,只有自己去寫__add__這個(gè)魔法方法

# 自己實(shí)現(xiàn)加法運(yùn)算的魔法方法后的效果:
print(stu1+stu2)

# 自己實(shí)現(xiàn)乘法運(yùn)算的魔法方法后的效果:
print(stu1*2)


all_student = [
    Student('stu1', 17, 90),
    Student('stu2', 17, 91),
    Student('stu3', 17, 92),
    Student('stu4', 17, 93)
]

#all_student.sort()TypeError: '<' not supported between instances of 'Student' and 'Student'

# 解決方法1:
all_student.sort(key=lambda item: item.score)
print(all_student)

# 解決方法2:運(yùn)算符重載
print(stu1 < stu2)
# 還可以找出最大值:
print(max(all_student))  # <'name': 'stu4', 'age': 17, 'score': 93>

=================內(nèi)存管理==============

from sys import getrefcount

手動(dòng)內(nèi)存管理:

c語言:內(nèi)存分為棧區(qū)間和堆區(qū)間善涨,棧區(qū)間的內(nèi)存是自動(dòng)開辟自動(dòng)釋放蒂萎,堆區(qū)間的內(nèi)存需要程序員寫代碼申請(qǐng)和釋放

1.內(nèi)存的開辟:

python所有的數(shù)據(jù)都是對(duì)象让禀,對(duì)象都是保存在堆區(qū)間套么,變量是保存在棧區(qū)間最蕾,變量中實(shí)際存儲(chǔ)的是堆中對(duì)應(yīng)的數(shù)據(jù)的地址(變量的本質(zhì)就是指針)

注意:

如果數(shù)據(jù)是數(shù)字和字符串就屬于特殊情況:除了數(shù)字和字符串對(duì)象,其他的對(duì)象都是每次需要數(shù)據(jù)的時(shí)候直接在堆中開辟空間
數(shù)字和字符串會(huì)先檢查這個(gè)數(shù)據(jù)之前是否保存過源内,如果保存過就直接用之前的數(shù)據(jù)葡粒,否則才會(huì)開辟新的空間

num1 = 100
num2 = 100
print(id(num1), id(num2))  # 1385658480 1385658480 地址相同

2.內(nèi)存的釋放:

python中內(nèi)存的釋放采用的是'垃圾回收機(jī)制'自動(dòng)釋放

a.垃圾回收機(jī)制:

1)看一個(gè)數(shù)據(jù)是否需要銷毀,就看這個(gè)對(duì)象的引用計(jì)數(shù)是否為0(引用:就是看沒有其他變量或者數(shù)據(jù)在用它)
2)如果這個(gè)對(duì)象引用計(jì)數(shù)不為零膜钓,就臨時(shí)刪除一下他嗽交,然后看會(huì)不會(huì)有其他的對(duì)象因?yàn)樗南ФВ绻心蔷桶阉麄冋嬲膭h除

b.循環(huán)引用:

在堆區(qū)間兩個(gè)數(shù)據(jù)互相的引用颂斜,而沒有棧區(qū)間的變量引用他們夫壁,兩個(gè)數(shù)據(jù)互相引用,這種情況就屬于循環(huán)引用

釋放棧區(qū)間的變量只有用del來刪除釋放

面試題:== 和 is 的區(qū)別:

沃疮!補(bǔ)充:is 的使用 -- 判斷兩個(gè)數(shù)據(jù)的地址是否相等盒让,注意和 == 區(qū)分梅肤!

list1 = [1,2,3]
list2 = [1,2,3]
print(list1 == list2)  True
print(list1 is list2)   False
list1 = [1, 2, 3]
list2 = [1, 2, 3]
# 打印它的引用計(jì)數(shù)
print(getrefcount(list1))  # 2   問題:不是說除數(shù)字和字符串以外都會(huì)從新開辟數(shù)據(jù)空間嗎?list1 = [1,2,3] list2 = [1,2,3]
print(id(list1), id(list2))

list3 = list1

=============深拷貝和淺拷貝============

import copy

使用變量的三種情況:

1.直接賦值 - 附的是地址邑茄,賦完值后兩個(gè)變量一模一樣

變量1 = 變量2
如果對(duì)變量1數(shù)據(jù)進(jìn)行修改姨蝴,變量的數(shù)據(jù)也是會(huì)修改

list1 = [1, 2, 3]
list2 = list1
list1.remove(1)  # 修改list1
print(list2)  # [2, 3]  打印list2,數(shù)據(jù)也有變化

2.淺拷貝

copy.copy(原變量)

列表[:],列表.copy()都屬于淺拷貝
將數(shù)據(jù)復(fù)制一遍到一個(gè)新的內(nèi)存空間肺缕,有一個(gè)新的地址左医,將這個(gè)新地址賦給這個(gè)新的變量,但是如果這個(gè)數(shù)據(jù)還引用了子對(duì)象搓谆,那么這個(gè)復(fù)制出來的新對(duì)象還是引用的原來的那個(gè)子對(duì)象炒辉,豪墅!不會(huì)把子對(duì)象也復(fù)制一遍泉手!,所以有子對(duì)象的情況下改變子對(duì)象還是會(huì)影響原來的變量

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def __repr__(self):
        return '<%s>' % str(self.__dict__)[1:-1]


stu1 = Student('tom', 18, 90)
stu2 = copy.copy(stu1)
stu2.name = 'bob'
print(stu1, stu2)

3.深拷貝

copy.deepcopy(原變量)
將數(shù)據(jù)復(fù)制一遍到一個(gè)新的內(nèi)存空間偶器,有一個(gè)新的地址斩萌,
將這個(gè)新地址賦給這個(gè)新的變量,但是如果這個(gè)數(shù)據(jù)還引用了子對(duì)象屏轰,會(huì)把子對(duì)象也復(fù)制一遍颊郎,所以完全不會(huì)影響原來的其他變量

stu3 = copy.deepcopy(stu1)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霎苗,隨后出現(xiàn)的幾起案子姆吭,更是在濱河造成了極大的恐慌,老刑警劉巖唁盏,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件内狸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厘擂,警方通過查閱死者的電腦和手機(jī)昆淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽严,“玉大人昂灵,你說我怎么就攤上這事∥杼眩” “怎么了眨补?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倒脓。 經(jīng)常有香客問我撑螺,道長(zhǎng),這世上最難降的妖魔是什么把还? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任实蓬,我火速辦了婚禮茸俭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘安皱。我一直安慰自己调鬓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布酌伊。 她就那樣靜靜地躺著腾窝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪居砖。 梳的紋絲不亂的頭發(fā)上虹脯,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音奏候,去河邊找鬼循集。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔗草,可吹牛的內(nèi)容都是我干的咒彤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼咒精,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镶柱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起模叙,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤歇拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后范咨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體故觅,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年湖蜕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逻卖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昭抒,死狀恐怖评也,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灭返,我是刑警寧澤盗迟,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站熙含,受9級(jí)特大地震影響罚缕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎静,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一邮弹、第九天 我趴在偏房一處隱蔽的房頂上張望黔衡。 院中可真熱鬧,春花似錦腌乡、人聲如沸盟劫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侣签。三九已至,卻和暖如春急迂,著一層夾襖步出監(jiān)牢的瞬間影所,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工僚碎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猴娩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓听盖,卻偏偏與公主長(zhǎng)得像胀溺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皆看,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • day16-內(nèi)存管理和拷貝 一、多繼承 1. 多繼承 python中的類支持多繼承 class 子類(父類1,父類...
    Octane閱讀 166評(píng)論 0 1
  • day16-內(nèi)存管理和拷貝 一背零、多繼承 python中的類支持多繼承 只能繼承第一個(gè)父類的對(duì)象屬性 二腰吟、運(yùn)算符的重...
    毋望閱讀 68評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 宏澧閱讀 448評(píng)論 0 0