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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

Python中的變量是什么

引言

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

"""
a 和 b 都貼在了同一個對象上
"""
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用來判斷引用是否相同
==用來判斷值是否相等
使用案例

"""
對于小整數(shù) 和 較短的字符串多次出現(xiàn),Python有一種緩存機制
多次出現(xiàn)的對象不再反復創(chuàng)建,后出現(xiàn)的對象直接引用前面的對象
"""
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語句直接回收變量,將它所貼對象的引用計數(shù)器減一。每有一個新變量引用對象,其引用計數(shù)器就會加一
引用計數(shù)器為 0 的對象會被后續(xù)回收
使用案例

a = "hello"
b = a # a,b 兩個標簽都貼在了對象 "hello" 上

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

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

result:

hello

NameError: name 'a' is not defined

傳參問題

引言

在學習Java的時候,都討論過傳引用還是傳值的問題
Python中全部都是傳用
使用案例

"""
函數(shù)傳參時,實際上是把實參賦值給形參
由形參來完成函數(shù)主體的運算
"""
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)存中會增加一塊空間來存儲(aa+bb),然后將aa標簽貼在上面
a 沒變,b也沒變
"""
x, y = [1, 2], [3]
z = add(x, y)
"""
函數(shù)調(diào)用之后
aa = [1, 2], bb = [3]
結(jié)合鴨子類型,以及前面講的魔法函數(shù),可以知道,此時會調(diào)用aa.extend(bb)
list是可變類型,直接在原地修改,aa和a都指向[1, 2]
a 變了,b沒變
"""
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)

默認值問題

返回一個名字列表

def name_list(li=[]):

這里可能對列表做一些包裝

todo

print(id(li)) # for later use

return li

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

x = name_list()
y = name_list()

在 x 中添加一個名字

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

result:

['MetaTian'] ['MetaTian']

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

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

result:

2499670504072 2499670504072

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

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

print(type(name_list))

result:

<class 'function'>

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

注:喜歡python + qun:839383765 可以獲取Python各類免費最新入門學習資料!

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

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

總結(jié)

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

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