str是不變對象,而list是可變對象。
對于可變對象恩静,比如list,對list進(jìn)行操作,list內(nèi)部的內(nèi)容是會變化的驶乾,比如:
a = ['c', 'b', 'a']
a.sort()
a
['a', 'b', 'c']
而對于不可變對象邑飒,比如str,對str進(jìn)行操作呢:
a = 'abc'
a.replace('a', 'A')
'Abc'
a
'abc'
雖然字符串有個(gè)replace()方法级乐,也確實(shí)變出了'Abc'疙咸,但變量a最后仍是'abc',應(yīng)該怎么理解呢风科?
我們先把代碼改成下面這樣:
a = 'abc'
b = a.replace('a', 'A')
b
'Abc'
a
'abc'
要始終牢記的是撒轮,a是變量,而'abc'才是字符串對象贼穆!有些時(shí)候题山,我們經(jīng)常說,對象a的內(nèi)容是'abc'故痊,但其實(shí)是指顶瞳,a本身是一個(gè)變量,它指向的對象的內(nèi)容才是'abc':
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
當(dāng)我們調(diào)用a.replace('a', 'A')時(shí)愕秫,實(shí)際上調(diào)用方法replace是作用在字符串對象'abc'上的慨菱,而這個(gè)方法雖然名字叫replace,但卻沒有改變字符串'abc'的內(nèi)容戴甩。相反符喝,replace方法創(chuàng)建了一個(gè)新字符串'Abc'并返回,如果我們用變量b指向該新字符串甜孤,就容易理解了协饲,變量a仍指向原有的字符串'abc',但變量b卻指向新字符串'Abc'了:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘ └───────┘
所以课蔬,對于不變對象來說囱稽,調(diào)用對象自身的任意方法,也不會改變該對象自身的內(nèi)容二跋。相反战惊,這些方法會創(chuàng)建新的對象并返回,這樣扎即,就保證了不可變對象本身永遠(yuǎn)是不可變的吞获。