亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

可變對(duì)象與不可變對(duì)象

jay_tian / 1436人閱讀

摘要:不可變對(duì)象不允許對(duì)自身內(nèi)容進(jìn)行修改。因?yàn)樗麄冋f(shuō)到不可變對(duì)象時(shí)用的是賦值,而說(shuō)到可變對(duì)象又用了的索引等方法,這根本是兩碼事。基于這一設(shè)定,兩者在功能上的最大區(qū)別就是不可變對(duì)象可以作為字典的鍵,而可變對(duì)象不行。

前陣子我們聊了下函數(shù)的參數(shù)傳遞以及變量賦值的一些內(nèi)容:關(guān)于函數(shù)參數(shù)傳遞,80%人都錯(cuò)了

簡(jiǎn)單回顧下要點(diǎn):

1. Python 中的變量不是裝有對(duì)象的“ 容器 ”,而是貼在對(duì)象上的“ 標(biāo)簽 ”。

2. 參數(shù)傳遞相當(dāng)于一次 賦值 :多貼了一個(gè)標(biāo)簽。

3. 至于在函數(shù)內(nèi)部對(duì)參數(shù)的修改是否會(huì)影響到外部變量的值,取決于你怎樣修改:如果是重新賦值就不會(huì),如果是修改對(duì)象自身內(nèi)容則會(huì)。

講到這里就有個(gè)常被提及的概念:
可變對(duì)象和不可變對(duì)象

在 Python 中,
可變對(duì)象 包括 list、dict、set、自定義類型 等;
不可變對(duì)象 包括 int、float、bool、str、tuple 等。

不可變對(duì)象不允許對(duì)自身內(nèi)容進(jìn)行修改。如果我們對(duì)一個(gè)不可變對(duì)象進(jìn)行賦值,實(shí)際上是生成一個(gè)新對(duì)象,再讓變量指向這個(gè)對(duì)象。哪怕這個(gè)對(duì)象簡(jiǎn)單到只是數(shù)字 0 和 1:


a = 0
print("a", id(a))
a = 1
print("a", id(a))

輸出:


a 4463151440
a 4463151472

因?yàn)閷?duì)象不可變,所以為了提高效率,Python 會(huì)使用一些公用的對(duì)象:


a = 1
print("a", id(a))
b = 1
print("b", id(b))
print(a == b)
print(a is b)
c = "hello world"
print("c", id(c))
d = "hello world"
print("d", id(d))
print(c == d)
print(c is d)

輸出:


a 4423761776
b 4423761776
True
True
c 4430180912
d 4430180912
True
True

這里順便提一下 is 這個(gè)操作符。它和 == 的區(qū)別在于:== 只判斷“值”是不是相等,而 is 則判斷是否為同一個(gè)對(duì)象,也就是地址一致。比如:


a = 2
b = 2.0
print(a == b)
print(a is b)

輸出:


True
False

而可變對(duì)象則可以對(duì)自身內(nèi)容進(jìn)行修改,如:


m = [1, 2, 3]
print("m", m, id(m))
m[1] = 4
print("m", m, id(m))
m.append(5)
print("m", m, id(m))

輸出:


m [1, 2, 3] 4536815752
m [1, 4, 3] 4536815752
m [1, 4, 3, 5] 4536815752

可以看到,雖然 m 的值發(fā)生了變化,但是地址沒(méi)變,還是原來(lái)那個(gè) m。

上次我也說(shuō)到,很多的教程都在用可變和不可變來(lái)談?wù)撡x值和參數(shù)傳遞,我覺(jué)得這很不好。因?yàn)樗麄冋f(shuō)到不可變對(duì)象時(shí)用的是賦值,而說(shuō)到可變對(duì)象又用了 list 的索引、apeend 等方法,這根本是兩碼事。如果大家都是賦值,那么無(wú)論是否可變,效果都是一樣的:


m = [1, 2, 3]
print("m", m, id(m))
m = [4, 5, 6]
print("m", m, id(m))

輸出


m [1, 2, 3] 4329894024
m [4, 5, 6] 4329910856

所以理解了 Python 的賦值原理,就明白這與是否可變無(wú)關(guān)。而可變對(duì)象于不可變對(duì)象本身的不同僅在于一個(gè)可以修改變量的值,而另一個(gè)不允許。

基于這一設(shè)定,兩者在功能上的最大區(qū)別就是: 不可變對(duì)象可以作為字典 dict 的鍵 key ,而可變對(duì)象不行。比如 list 不能作為字典的鍵,但 tuple 可以。

另外,明白了可變與不可變的區(qū)別,一些方法的效果也就自然理解了:


s = "abc"
s2 = s.replace("b", "d")
print("s", s)
print("s2", s2)
m = [1, 2, 3]
m2 = m.reverse()
print("m", m)
print("m2", m2)

輸出:


s abc
s2 adc
m [3, 2, 1]
m2 None

因?yàn)?str 是不可變對(duì)象,所以它的方法如 replacestrip、upper 都不可能修改原對(duì)象, 只會(huì)返回一個(gè)新對(duì)象 ,比如重新賦值才可以。而 list 是可變對(duì)象,它的方法如 reverse、sortappend,都是 在原有對(duì)象上直接修改 ,無(wú)返回值。

不過(guò),有個(gè)特殊情況需要注意:


m = [1, 2, 3]
print("m", m, id(m))
m += [4]
print("m", m, id(m))
m = m + [5]
print("m", m, id(m))

輸出


m [1, 2, 3] 4494164104
m [1, 2, 3, 4] 4494164104
m [1, 2, 3, 4, 5] 4494181128

m = m +m += 雖然是一樣的結(jié)果,但 m 指向的對(duì)象卻發(fā)生了變化。原因在于,前者是做了賦值操作,而后者其實(shí)是調(diào)用的 __iadd__ 方法。

如果我們就是需要產(chǎn)生一個(gè) list 對(duì)象的副本,可以通過(guò) [:]


m = [1, 2, 3]
print("m", m, id(m))
n = m[:]
print("n", n, id(n))
n[1] = 4
print("m", m)
print("n", n)

這樣對(duì) n 的修改便不再會(huì)影響到 m,因?yàn)樗鼈円巡皇峭粋€(gè)對(duì)象。

那么如果是這樣呢:


m = [1, 2, [3]]
n = m[:]
n[1] = 4
n[2][0] = 5
print(m)

猜一猜 m 的結(jié)果是什么?

[1, 2, [3]]

[1, 4, [3]]

[1, 2, [5]]

[1, 4, [5]]

其它結(jié)果

再去 Python 里執(zhí)行下看看輸出,是不是和預(yù)期一樣,想想為什么?這個(gè)牽涉到淺拷貝、深拷貝的概念,我們下次再聊。

════
其他文章及回答:
如何自學(xué)Python | 新手引導(dǎo) | 精選Python問(wèn)答 | Python單詞表 | 區(qū)塊鏈 | 人工智能 | 雙11 | 嘻哈 | 爬蟲(chóng) | 排序算法 | 我用Python | 高考 | 世界杯 | 競(jìng)猜 | requests
歡迎搜索及關(guān)注: Crossin的編程教室

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/42499.html

相關(guān)文章

  • Python中的可變與不可變對(duì)象

    摘要:中的可變與不可變對(duì)象中的所有東西都是一個(gè)對(duì)象。和內(nèi)置函數(shù)以整數(shù)形式返回對(duì)象的標(biāo)識(shí)。更改可變對(duì)象很便宜。不可變的例外并非所有的不可變對(duì)象都是不可變的。所以引用該對(duì)象的變量不會(huì)改變,但對(duì)象本身正在改變,但僅在函數(shù)范圍內(nèi)。 Python中的可變與不可變對(duì)象 Python中的所有東西都是一個(gè)對(duì)象。每個(gè)Python新手都應(yīng)該學(xué)習(xí)的是,Python中的所有對(duì)象都可以是可變的或不可變的。showIm...

    wizChen 評(píng)論0 收藏0
  • python程序員的基本素養(yǎng)--你從沒(méi)見(jiàn)過(guò)的Python變量引用

    摘要:變量在我們的編程中是最基礎(chǔ)的概念,它就相當(dāng)于我們蓋大樓用的磚塊一樣不可或缺。理解變量的運(yùn)行方式至關(guān)重要。雖然他們的食物是一樣的。但是,像這樣這樣并沒(méi)有新建對(duì)象,而是將的引用傳遞給了,他們都指向一個(gè)對(duì)象。這個(gè)就是的垃圾回收機(jī)制。 變量在我們的編程中是最基礎(chǔ)的概念,它就相當(dāng)于我們蓋大樓用的磚塊一樣不可或缺。理解變量...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • Java? 教程(不可變對(duì)象

    不可變對(duì)象 如果一個(gè)對(duì)象的狀態(tài)在構(gòu)造后不能改變,則該對(duì)象被認(rèn)為是不可變的,對(duì)不可變對(duì)象的最大依賴被廣泛認(rèn)為是一種創(chuàng)建簡(jiǎn)單、可靠代碼的合理策略。 不可變對(duì)象在并發(fā)應(yīng)用程序中特別有用,由于它們不能改變狀態(tài),因此它們不會(huì)被線程干擾破壞或在不一致的狀態(tài)下觀察。 程序員通常不愿意使用不可變對(duì)象,因?yàn)樗麄儞?dān)心創(chuàng)建新對(duì)象的成本而不是就地更新對(duì)象的成本,對(duì)象創(chuàng)建的影響經(jīng)常被高估,并且可以通過(guò)與不可變對(duì)象相關(guān)聯(lián)的一...

    Songlcy 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶(純手工)=> Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個(gè)代表正負(fù)號(hào)的正。雖然一點(diǎn)技術(shù)含量沒(méi)有,但是你要懂序列也許叫可迭代對(duì)象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無(wú)法增刪改, 只可查 升操: + 與...

    Andrman 評(píng)論0 收藏0
  • python小記

    可變數(shù)據(jù)對(duì)象與不可變數(shù)據(jù)對(duì)象 不可變數(shù)據(jù)對(duì)象:不能改變對(duì)象本身,只能改變引用的指向。具體包括數(shù)字、字符串、元組可變數(shù)據(jù)對(duì)象:可以改變對(duì)象自身。具體包括列表、詞典

    joyqi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<