日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python入门系列:对象引用、垃圾回收、可变性

發(fā)布時(shí)間:2023/11/29 python 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python入门系列:对象引用、垃圾回收、可变性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python中的變量是什么

引言

Python和java中的變量本質(zhì)不一樣,java的變量可以理解為一個(gè)盒子,用來(lái)容納我們的對(duì)象,使用前要先聲明它,好分配給我們合適的內(nèi)存空間。Python的變量可以理解為一個(gè)標(biāo)簽,先構(gòu)造出對(duì)象,再將變量貼在對(duì)象上。
Python變量沒(méi)有類型,對(duì)象才有,本質(zhì)上是指針。同一個(gè)變量,可以表示不同對(duì)象。
使用案例

"""
a 和 b 都貼在了同一個(gè)對(duì)象上
"""
a = [1, 2]
b = a
a.append(6)
print(a, b)
print(a is b)
print(id(a), id(b))

result:

[1, 2, 6] [1, 2, 6]

True

1840524096136 1840524096136

is和==的區(qū)別

引言

is用來(lái)判斷引用是否相同
==用來(lái)判斷值是否相等
使用案例

"""
對(duì)于小整數(shù) 和 較短的字符串多次出現(xiàn),Python有一種緩存機(jī)制
多次出現(xiàn)的對(duì)象不再反復(fù)創(chuàng)建,后出現(xiàn)的對(duì)象直接引用前面的對(duì)象
"""
a, b, c, d = 1, 1, -123, -123
print(a is b)
print(c is d)

result:

True

False

a, b = [1, 2, 3], [1, 2, 3]
print(a is b)
print(a == b)

result:

False

True

del和垃圾回收

引言

del語(yǔ)句直接回收變量,將它所貼對(duì)象的引用計(jì)數(shù)器減一。每有一個(gè)新變量引用對(duì)象,其引用計(jì)數(shù)器就會(huì)加一
引用計(jì)數(shù)器為 0 的對(duì)象會(huì)被后續(xù)回收
使用案例

a = "hello"
b = a # a,b 兩個(gè)標(biāo)簽都貼在了對(duì)象 "hello" 上

"hello"的引用計(jì)數(shù)器為2

del a # "hello"的引用計(jì)數(shù)器減一
print(b)
print(a)

result:

hello

NameError: name 'a' is not defined

傳參問(wèn)題

引言

在學(xué)習(xí)Java的時(shí)候,都討論過(guò)傳引用還是傳值的問(wèn)題
Python中全部都是傳用
使用案例

"""
函數(shù)傳參時(shí),實(shí)際上是把實(shí)參賦值給形參
由形參來(lái)完成函數(shù)主體的運(yùn)算
"""
def add(aa, bb):
aa += bb
return aa
a, b = 1, 2
c = add(a, b)
"""
函數(shù)調(diào)用之后
aa = 1, bb = 2
aa += bb => aa = aa + bb
int 是不可變類型,內(nèi)存中會(huì)增加一塊空間來(lái)存儲(chǔ)(aa+bb),然后將aa標(biāo)簽貼在上面
a 沒(méi)變,b也沒(méi)變
"""
x, y = [1, 2], [3]
z = add(x, y)
"""
函數(shù)調(diào)用之后
aa = [1, 2], bb = [3]
結(jié)合鴨子類型,以及前面講的魔法函數(shù),可以知道,此時(shí)會(huì)調(diào)用aa.extend(bb)
list是可變類型,直接在原地修改,aa和a都指向[1, 2]
a 變了,b沒(méi)變
"""
m, n = (1, 2), (3,)
p = add(m, n)
"""
和整數(shù)一樣
"""
print(a, b, c)
print(x, y, z)
print(m, n, p)

result:

1 2 3

[1, 2, 3] [3] [1, 2, 3]

(1, 2) (3,) (1, 2, 3)

默認(rèn)值問(wèn)題

返回一個(gè)名字列表

def name_list(li=[]):

這里可能對(duì)列表做一些包裝

todo

print(id(li)) # for later use

return li

創(chuàng)建出兩個(gè)空的名字列表

x = name_list()
y = name_list()

在 x 中添加一個(gè)名字

x.append("MetaTian")
print(x, y)

result:

['MetaTian'] ['MetaTian']

我們創(chuàng)建出兩個(gè)空的名字列表,稍后給其中一個(gè)添加了一個(gè)名字。結(jié)果,這兩個(gè)名字列表是一樣的,我們?cè)賮?lái)看下二者的id:

print(id(x), id(y))

result:

2499670504072 2499670504072

兩者id是一樣的,說(shuō)明兩者指向同一個(gè)對(duì)象,那這個(gè)對(duì)象又是什么呢?其實(shí)它就是函數(shù)參數(shù)列表中一個(gè)變量的默認(rèn)值,就是那個(gè)空列表,可以自己在代碼中打開注釋,打印li的id即可驗(yàn)證。

Python中,一切皆對(duì)象,函數(shù)也是一個(gè)對(duì)象,那么函數(shù)是什么類型的呢?

print(type(name_list))

result:

<class 'function'>

當(dāng)解釋器執(zhí)行到def關(guān)鍵字時(shí),它會(huì)結(jié)合下面的代碼生成一個(gè)函數(shù)對(duì)象,而我們提供的參數(shù)默認(rèn)值,就被當(dāng)做對(duì)象的一種屬性封裝起來(lái)了。于是,后面的兩次函數(shù)調(diào)用,都是將這個(gè)對(duì)象賦值給了x, y兩個(gè)變量。也就是說(shuō)x, y指向了同一個(gè)對(duì)象。

注:喜歡python + qun:839383765 可以獲取Python各類免費(fèi)最新入門學(xué)習(xí)資料!

轉(zhuǎn)載于:https://blog.51cto.com/14186420/2349825

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python入门系列:对象引用、垃圾回收、可变性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。