python中一切皆對象,
python中一切皆引用铅歼。
對象這是權(quán)威書籍中都有的話公壤,但引用就不是了,根據(jù)c語言中的引用理解python中的‘變量’椎椰,更好理解厦幅。
引用指向?qū)ο螅瑢ο蟛卦谝煤筮吙荒芡ㄟ^引用對對象操作确憨,在python中所能見到的都是這個引用,而引用這個數(shù)據(jù)類型只保存一個數(shù)據(jù)就是對象的地址瓤的。
python中的數(shù)據(jù)類型分可變和不可變類型
字符串休弃,元組,set圈膏,都是不可變塔猾,生成后其值無法改變,只能通過改變引用指向其他字符串來改變
>>> a="hello"
>>> id(a)
3070406016L
>>> a="world"
>>> id(a)
3070405952L
字典和列表都是可變對象稽坤,能通過引用對其改變
>>> a=[1,2,3,4]
>>> id(a)
3074666124L
>>> a[1]=5
>>> a
[1, 5, 3, 4]
>>> id(a)
3074666124L
一個對象賦值給引用表示把對象的地址賦值給了引用
一個引用賦值給引用 表示 把引用中的地址賦值給引用
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> a[0]=4
>>> b
[4, 2, 3]
有了上邊的鋪墊就能理解下邊的函數(shù)中的參數(shù)
在大部分編程語言中丈甸,函數(shù)的參數(shù)都是“值傳遞”,c語言中的引用和指針雖然有址傳遞慎皱,但是那個址是指針或者引用的值老虫,根本上講也是傳遞的其中的內(nèi)容 值,而且是復(fù)制進(jìn)去的茫多。
a=[1,2]
def f(arg):
??? arg.append(3)
print(a)
f(a)
print(a)
==========================
[1, 2]
[1, 2, 3]
結(jié)果會改變因為arg這個引用也指向a所以可以通過arg改變a值類似下邊代碼
a=[1,2]
b=a
b.append(3)
print(a,b)
[1, 2, 3] [1, 2, 3]
看另一個例子:
a=[1,2]
def f(arg):
??? arg=[3,4]
print(a)
f(a)
print(a)
結(jié)果
[1, 2]
[1, 2]
并沒有改變a的值祈匙,因為參數(shù)傳遞的是引用的值就是參數(shù)指向了a指向的地址 但是在函數(shù)里把另一對像的地址賦值給了這個參數(shù),至此參數(shù)跟a沒有任何關(guān)系了天揖,類似于下邊代碼
a=[1,2]
b=a
b=[3,4]
print(a,b)
這一切都是因為:
一切皆對象
一切皆引用
=賦值永遠(yuǎn)給的是地址
參數(shù)永遠(yuǎn)是新的引用