Python中,萬物皆對象汽煮。
python中不存在所謂的傳值調(diào)用济丘,一切傳遞的都是對象的引用,也可以認(rèn)為是傳址生巡。
一耙蔑、可變對象和不可變對象
Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指孤荣,對象的內(nèi)容可變甸陌,而不可變對象是指對象內(nèi)容不可變。
不可變(immutable):int盐股、字符串(string)钱豁、float、(數(shù)值型number)疯汁、元組(tuple)
可變(mutable):字典型(dictionary)寥院、列表型(list)
i =73
i +=2
>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True
如上所示霹肝,因為整數(shù)為不可變,x,y,z在內(nèi)存中均指向一個值為1的內(nèi)存地址塑煎,也就是說沫换,x,y,z均指向的是同一個地址,值得注意的是最铁,整形來說讯赏,目前僅支持(-1,100)。
總結(jié)一下冷尉,不可變對象的優(yōu)缺點漱挎。
優(yōu)點是,這樣可以減少重復(fù)的值對內(nèi)存空間的占用雀哨。
缺點呢磕谅,如例1所示,我要修改這個變量綁定的值雾棺,如果內(nèi)存中沒用存在該值的內(nèi)存塊膊夹,那么必須重新開辟一塊內(nèi)存,把新地址與變量名綁定捌浩。而不是修改變量原來指向的內(nèi)存塊的值放刨,這回給執(zhí)行效率帶來一定的降低。
下面看一個可變對象的例子(例3)
二尸饺、函數(shù)參數(shù):
Python函數(shù)參數(shù)對于可變對象进统,函數(shù)內(nèi)對參數(shù)的改變會影響到原始對象助币;對于不可變對象,函數(shù)內(nèi)對參數(shù)的改變不會影響到原始參數(shù)麻昼。原因在于:
1奠支、可變對象,參數(shù)改變的是可變對象抚芦,其內(nèi)容可以被修改倍谜。
2、不可變對象叉抡,改變的是函數(shù)內(nèi)變量的指向?qū)ο蟆?/p>
Python中的對象包含三要素:id尔崔、type、value
其中id用來唯一標(biāo)識一個對象褥民,type標(biāo)識對象的類型季春,value是對象的值
is判斷的是a對象是否就是b對象,是通過id來判斷的
==判斷的是a對象的值是否和b對象的值相等消返,是通過value來判斷的
如下代碼或許可以幫助你理解载弄。
>>> a = 1
>>> b = 1.0
>>> a is b
False
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
14986000
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
12777000