python 所有的數(shù)據(jù)類型都是類伴榔,數(shù)據(jù)都是對象所有的運(yùn)算符操作矛紫,本質(zhì)都是調(diào)用數(shù)據(jù)對應(yīng)的魔法方法每個(gè)運(yùn)算符對應(yīng)一個(gè)固定的魔法方法
class Stu():
def __init__(self,name,age=0,score=0):
self.name=name
self.age=age
self.score=score
# self + other = return 返回值
def __add__(self,other):
return self.age+other
# 練習(xí) 讓學(xué)生類的對象支持乘法 ,讓對象*3產(chǎn)生一個(gè)列表
# [對象稳衬,對象初橘,對象]地址相同
def __mul__(self, other:int):
return [self]*other
def __gt__(self, other):
return self.score>other.score
def __repr__(self):
return '<'+str(self.__dict__)[1:-1]+'>'
s1=Stu('小王',18,60)
s2=Stu('小張',20,70)
s=s1*3
print(s1>s2)
print(s)
2.內(nèi)存管理
數(shù)據(jù)的存儲
python的變量都存儲在棧區(qū)間耐朴,對象在堆區(qū)間
函數(shù)以及函數(shù)的調(diào)用是在棧區(qū)間
在聲明變量或聲明函數(shù)的時(shí)候衡楞,系統(tǒng)會在內(nèi)存棧區(qū)間開辟空間保存變量
再給變量賦值的時(shí)候會把數(shù)據(jù)存在堆區(qū)間吱雏。而把數(shù)據(jù)的地址賦給變量
但是字符串和數(shù)字特殊,如果是用數(shù)字和字符串給變量賦值瘾境,不會直接辟空間保存數(shù)據(jù)歧杏,而是先在內(nèi)存檢測這個(gè)數(shù)據(jù)之前是否已經(jīng)存儲過,如果已經(jīng)存儲直接使用上次保存的數(shù)據(jù)迷守,沒有存儲才會開辟新的空間保存數(shù)據(jù)
內(nèi)存的釋放
1.引用計(jì)數(shù)
python每個(gè)對象都有一個(gè)屬性叫引用計(jì)數(shù)犬绒,用來保存當(dāng)前對象
的引用個(gè)數(shù) 用了對象的地址一次記一次
2.垃圾回收機(jī)制
判斷一個(gè)對象是否銷毀,就看這個(gè)對象的引用計(jì)數(shù)是否為0
[1,2] # 引用計(jì)數(shù)為0 沒用變量保存
10 # 引用計(jì)數(shù)為0 沒用變量保存
class S:
pass
S() # 引用計(jì)數(shù)為0 沒用變量保存
3.淺拷貝
直接給一個(gè)變量賦值給另一個(gè)變量兑凿,本質(zhì)是將地址賦給另一個(gè)變量凯力。兩個(gè)變量指向同一個(gè)地址,數(shù)據(jù)會互相影響
淺拷貝
淺拷貝可以通過導(dǎo)入copy模塊應(yīng)用copy()方法 切片和copy()方法都是淺拷貝
淺拷貝只會拷貝當(dāng)前對象的數(shù)據(jù)并給一個(gè)新地址礼华,不會拷貝子對象
2.深拷貝 導(dǎo)入模塊copy 可以拷貝任何對象 拷貝數(shù)據(jù) 但地址不同
copy.deepcopy(對象)
深拷貝會拷貝當(dāng)前對象的數(shù)據(jù)(包括子對象)給一個(gè)新地址
t1=[1,2,3]
t2=[5,6,t1]
t3=copy.copy(t2)
t4=copy.deepcopy(t2)
print(t3,t4)
print(id(t3[2]))
print(id(t1))
print(id(t4[2]))
>>>[5, 6, [1, 2, 3]] [5, 6, [1, 2, 3]]
>>>43361800
>>>43361800
>>>43363144
t3是淺拷貝
t4是深拷貝
可以發(fā)現(xiàn)咐鹤,t3里的第三個(gè)元素的id與t1相同,指向的同一個(gè)列表
t4里的第三個(gè)元素則是新的地址
說明 深拷貝會考慮到被拷貝對象里的子對象圣絮,并且給子對象也是不同的地址
而淺拷貝只是將被拷貝對象的數(shù)據(jù)復(fù)制一份然后賦給一個(gè)新的支持