python中的變量和java中的變量本質(zhì)是不一樣的协屡,python中的變量實(shí)質(zhì)上是一個(gè)指針(指針的大小固定的)
a = 1
a = "abc"
#1.a貼在1上面
#2.先生成對(duì)象感憾,然后便利貼
a= [1, 2, 3]
b=a
print(id(a), id(b)) #a和b是同一個(gè)對(duì)象
print (a is b)
#結(jié)果
140519998094152 140519998094152
True
is 和 ==的區(qū)別
is可以用來判斷id是否相等
a = [1, 2, 3, 4]
b = [1 ,2, 3, 4]
140519998162248 140519998864264
False
對(duì)于這種賦值弛槐,雖然所賦值是相同的搪泳,但是他們的id不同楚殿,即他們是不同的對(duì)象哮兰,a is b 即為false ,但是有個(gè)特例: a = 1 b = 1 時(shí)他們的id相同贺纲。其實(shí)這是python內(nèi)部的優(yōu)化機(jī)制航闺,對(duì)于小整數(shù)和小的字符串來說,python在前邊定義一個(gè)對(duì)象時(shí)猴誊,下次在遇到時(shí)會(huì)直接調(diào)用前邊生成的對(duì)象潦刃,而不會(huì)去重新申請(qǐng)一個(gè)。
a = [1, 2, 3, 4]
b = [1 ,2, 3, 4]
print(id(a), id(b))
print(a == b)
140519999248264 140519999070600
True
他們的對(duì)象內(nèi)存地址不一樣懈叹,但是乖杠,a和b里的值是相等的,這是由于a和b都為list,而list里有內(nèi)置的魔法函數(shù)eq通過eq魔法函數(shù)可以判斷里邊兩個(gè)的值是否相同澄成,若相同則返回True
class People:
pass
person = People()
if type(person) is People: #在判斷persion是一個(gè)什么類時(shí)就可以使用is 切記不可使用==胧洒, 或者使用isinstance()
print("yes")
del語句和垃圾回收
python中垃圾回收的算法回收的算法是采用引用計(jì)數(shù),當(dāng)程序中有一個(gè)變量引用該python對(duì)象時(shí)环揽,python會(huì)自動(dòng)保證該對(duì)象引用計(jì)數(shù)為1略荡;當(dāng)程序中有兩個(gè)變量引用該python對(duì)象時(shí)庵佣,python會(huì)自動(dòng)保證該對(duì)象計(jì)數(shù)器為2歉胶, 以此類推,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器變?yōu)? 時(shí)巴粪,則說明程序中不再有變量對(duì)其進(jìn)行引用通今,因此python就會(huì)回收該對(duì)象。
大多數(shù)情況肛根,python的ARC都能準(zhǔn)確辫塌,高效的回收系統(tǒng)中的每一個(gè)對(duì)象。但如果系統(tǒng)中出現(xiàn)循環(huán)引用時(shí)派哲,比如a對(duì)象持有一個(gè)實(shí)例變量引用對(duì)象b臼氨,而b對(duì)象又持有一個(gè)實(shí)例變量引用對(duì)象a,此時(shí) 兩個(gè)對(duì)象的計(jì)數(shù)器都為1芭届, 而實(shí)際上python不再需要這兩個(gè)對(duì)象储矩,也沒有程序在引用他們,系統(tǒng)回收他們時(shí)python的垃圾回收器就沒有那兒快褂乍,要等到專門的循環(huán)垃圾回收器(Cyclic Garbage Collector)來檢測(cè)并回收這種引用循環(huán)
當(dāng)一個(gè)對(duì)象被垃圾回收式持隧,python就會(huì)自動(dòng)調(diào)用該對(duì)象的del方法
對(duì)一個(gè)對(duì)象執(zhí)行del操作,該變量不一定會(huì)回收逃片,只有當(dāng)對(duì)象的引用計(jì)數(shù)器變?yōu)?時(shí)屡拨,該對(duì)象才會(huì)被回收。因此,如果一個(gè)對(duì)象有多個(gè)變量引用它呀狼,那么del其中一個(gè)變量是不會(huì)回收該對(duì)象的裂允。
class Item:
def __init__(self, name, price):
self.name = name
self.price = price
#定義析構(gòu)函數(shù)
def __del__(self):
print('del刪除對(duì)象')
#創(chuàng)建一個(gè)Item對(duì)象,將其賦給im變量
im = Item('鼠標(biāo)', 29.8)
x = im
#打印im所引用的對(duì)象
del im
print("---------------")
結(jié)果為
---------------
del刪除對(duì)象
若注釋掉 x = im 結(jié)果則改變?yōu)槿缦?
del刪除對(duì)象
---------------
當(dāng)沒有注釋掉x = im時(shí)哥艇, item對(duì)象被兩個(gè)變量所引用叫胖,所以在執(zhí)行完del im時(shí)并不會(huì)去回收item對(duì)象,所以先輸出--------她奥,當(dāng)程序完全執(zhí)行完成后瓮增,引用item的對(duì)象的變量被釋放,然后系統(tǒng)便會(huì)執(zhí)行del方法哩俭,回收item對(duì)象绷跑。
當(dāng) x = im被注釋后,只有一個(gè)變量去引用item對(duì)象凡资,所以在執(zhí)行完后程序變回去調(diào)用del方法砸捏,回收item對(duì)象,然后在繼續(xù)向下執(zhí)行 輸出-----