2.9Python進(jìn)階09 動(dòng)態(tài)類型

動(dòng)態(tài)類型(dynamic typing)是Python另一個(gè)重要的核心概念尚困。我們之前說過,Python的變量(variable)不需要聲明贝奇,而在賦值時(shí)芝此,變量可以重新賦值為任意值。這些都與動(dòng)態(tài)類型的概念相關(guān)寿酌。

動(dòng)態(tài)類型

在我們接觸的對(duì)象中胰苏,有一類特殊的對(duì)象,是用于存儲(chǔ)數(shù)據(jù)的醇疼。常見的該類對(duì)象包括各種數(shù)字硕并,字符串,表秧荆,詞典倔毙。在C語言中,我們稱這樣一些數(shù)據(jù)結(jié)構(gòu)為變量乙濒。而在Python中陕赃,這些事對(duì)象。
對(duì)象是儲(chǔ)存在內(nèi)存中的實(shí)體颁股。膽我們并不能直接接觸到該對(duì)象么库。我們?cè)诔绦蛑袑懭氲膶?duì)象名,只是指向這一對(duì)象的引用(reference)甘有。

引用和對(duì)象分離诉儒,是動(dòng)態(tài)類型的核心。引用可以隨時(shí)指向一個(gè)新的對(duì)象:

a = 3
a = 'at'

第一個(gè)語句中亏掀,3是儲(chǔ)存在內(nèi)存中的一個(gè)整數(shù)對(duì)象忱反。通過賦值泛释,引用a指向?qū)ο?。
第二個(gè)語句中缭受,內(nèi)存中建立對(duì)象'at'胁澳,是一個(gè)字符串(string)。引用a指向了'at'米者。此時(shí)韭畸,對(duì)象3不再有引用指向它。Python會(huì)自動(dòng)將沒有引用指向的對(duì)象銷毀(destruct)蔓搞,釋放相應(yīng)內(nèi)存胰丁。
(對(duì)于小的整數(shù)和短字符串,Python會(huì)緩存這些對(duì)象喂分,而不是頻繁的建立和銷毀锦庸。)

a = 5
b = a
a = a + 2

再看這個(gè)例子。通過前兩個(gè)句子蒲祈,我們讓a,b指向同一個(gè)整數(shù)對(duì)象5(b = a的含義是讓引用b指向引用a所指的那一個(gè)對(duì)象)甘萧。但第三個(gè)句子實(shí)際上對(duì)引用a重新賦值,讓a指向一個(gè)新的對(duì)象7.此時(shí)a,b分別指向不同的對(duì)象梆掸。我們看到扬卷,即使是多個(gè)引用指向同一個(gè)對(duì)象,如果一個(gè)引用值發(fā)送變化酸钦,那么實(shí)際上是讓這個(gè)引用指向一個(gè)新的引用怪得,并不影響其他的引用的指向。從效果上看卑硫,就是各個(gè)引用各自獨(dú)立徒恋,互不影響。

其它數(shù)據(jù)對(duì)象也是如此:

L1 = [1,2,3]
L2 = L1
L1 = 1

但注意以下情況

L1 = [1,2,3]
L2 = L1
L1[0] = 10
print L2

在該情況下欢伏,我們不再對(duì)L1這一引用賦值入挣,而是對(duì)L1所指向的表的元素賦值。結(jié)果是硝拧,L2也同時(shí)發(fā)生變化财岔。
原因何在呢?因?yàn)長1河爹,L2的指向沒有發(fā)送變化匠璧,依然指向那個(gè)表。表實(shí)際上市包含了多個(gè)引用的對(duì)象(每個(gè)引用是一個(gè)元素咸这,比如L1[0]夷恍,L1[1]...,每個(gè)引用指向一個(gè)對(duì)象,比如1,2,3酿雪,遏暴。而L1[0] = 10這一賦值操作,并不是改變L1的指向指黎,而是對(duì)L1[0]朋凉,也就是表對(duì)象的一部分(一個(gè)元素),進(jìn)行操作醋安,所以所有指向該對(duì)象的引用都受到影響杂彭。
(與之形成對(duì)比的是,我們之前的賦值操作都沒有對(duì)對(duì)象自身發(fā)生作用吓揪,只是改變引用指向亲怠。)

列表可以通過引用其元素,改變對(duì)象自身(in-place change)柠辞。這種對(duì)象類型团秽,稱為可變數(shù)據(jù)對(duì)象(mutable object),詞典也是這樣的數(shù)據(jù)類型叭首。
而像之前的數(shù)字和字符串习勤,
不能改變對(duì)象本身,只能改變引用的指向焙格,稱為不可變數(shù)據(jù)對(duì)象(immutable object)**姻报。
我們之前學(xué)的元組(tuple),盡管可以調(diào)用引用元素间螟,但不可以賦值,因此不能改變對(duì)象自身损肛,所以也算是immutable object厢破。

從動(dòng)態(tài)類型看函數(shù)的參數(shù)傳遞

函數(shù)的參數(shù)傳遞,本質(zhì)上傳遞的是引用治拿。比如說:

def f(x):
    x = 100
    print x

a = 1
f(a)
print a

參數(shù)x是一個(gè)新的引用摩泪,指向a所指的對(duì)象。如果參數(shù)是不可變(immutable)的對(duì)象劫谅,a和x引用之間相互獨(dú)立见坑。對(duì)參數(shù)x的操作不會(huì)影響引用a。這樣的傳遞類似于C語言中的值傳遞捏检。

如果傳遞的是可變(mutable)的對(duì)象荞驴,那么改變函數(shù)參數(shù),有可能改變?cè)瓕?duì)象贯城。所有指向原對(duì)象的引用都會(huì)受影響熊楼,編程的時(shí)候要對(duì)比問題留心。比如說:

def f(x):
    x[0] = 200
    print x

a = [1,2,3]
f(a)
print a

動(dòng)態(tài)類型是Python的核心機(jī)制之一能犯■昶可以在應(yīng)用中慢慢熟悉犬耻。

總結(jié)

引用和對(duì)象的分離,對(duì)象是內(nèi)存中儲(chǔ)存數(shù)據(jù)的實(shí)體执泰,引用指向?qū)ο蟆?br> 可變對(duì)象枕磁,不可變對(duì)象
函數(shù)值傳遞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市术吝,隨后出現(xiàn)的幾起案子计济,更是在濱河造成了極大的恐慌,老刑警劉巖顿苇,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峭咒,死亡現(xiàn)場離奇詭異,居然都是意外死亡纪岁,警方通過查閱死者的電腦和手機(jī)凑队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔翰,“玉大人漩氨,你說我怎么就攤上這事∫旁觯” “怎么了叫惊?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長做修。 經(jīng)常有香客問我霍狰,道長,這世上最難降的妖魔是什么饰及? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任蔗坯,我火速辦了婚禮,結(jié)果婚禮上燎含,老公的妹妹穿的比我還像新娘宾濒。我一直安慰自己,他們只是感情好屏箍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布绘梦。 她就那樣靜靜地躺著,像睡著了一般赴魁。 火紅的嫁衣襯著肌膚如雪卸奉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天颖御,我揣著相機(jī)與錄音择卦,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秉继,可吹牛的內(nèi)容都是我干的祈噪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼尚辑,長吁一口氣:“原來是場噩夢啊……” “哼辑鲤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杠茬,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤月褥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瓢喉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宁赤,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年栓票,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了决左。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡走贪,死狀恐怖佛猛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坠狡,我是刑警寧澤继找,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站逃沿,受9級(jí)特大地震影響婴渡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凯亮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一边臼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧触幼,春花似錦、人聲如沸究飞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亿傅。三九已至媒峡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葵擎,已是汗流浹背谅阿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人签餐。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓寓涨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氯檐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒良,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容