?
Python是一門(mén)強(qiáng)類(lèi)型的動(dòng)態(tài)語(yǔ)言。
字面常量,變量沒(méi)有類(lèi)型,變量只是在特定的時(shí)間指向特定的對(duì)象而已,變量所指向的對(duì)象是有類(lèi)型的。
變量:變量在賦值時(shí)被創(chuàng)建,它可以是任何對(duì)象的引用,但必須在引用前被賦值。
?
舉例來(lái)說(shuō):當(dāng)我們?nèi)缦沦x值時(shí):
a = 3 # 給一個(gè)對(duì)象3賦予變量a
對(duì)于上面的賦值,Python將會(huì)明確的執(zhí)行3個(gè)步驟來(lái)響應(yīng)這個(gè)語(yǔ)句:
創(chuàng)建一個(gè)對(duì)象代表值3;
如果不存在變量a,就創(chuàng)建變量a;
把變量a與新創(chuàng)建的對(duì)象3關(guān)聯(lián)。
變量隨著賦值操作出現(xiàn)的。變量和對(duì)象是被存儲(chǔ)在不同的內(nèi)存空間中的。變量與對(duì)象通過(guò)指針相關(guān)聯(lián)。變量永遠(yuǎn)指向?qū)ο笄矣啦恢赶蜃兞?。隨著賦值a = 3語(yǔ)句的執(zhí)行,變量a就變成了對(duì)象3的一個(gè)引用。
如果你想學(xué)習(xí)Python可以來(lái)這個(gè)群,首先是472,中間是309,最后是261,里面可以學(xué)習(xí)和交流,也有資料可以下載。
變量與對(duì)象之間的鏈接在Python中稱之為引用。也就是說(shuō),一個(gè)引用也就是一種關(guān)聯(lián),在內(nèi)存中以指針的形式實(shí)現(xiàn)。
變量、對(duì)象與引用的區(qū)別:
+ 變量 是Python解釋器系統(tǒng)表中的一些條目, 它們是用來(lái)指向?qū)ο蟮摹?br />
+ 對(duì)象 是一些列的被分配的內(nèi)存, 有足夠的空間存儲(chǔ)與之相關(guān)的數(shù)據(jù)類(lèi)型。
+ 引用 自動(dòng)地跟隨在變量與對(duì)象之間。
對(duì)象才有類(lèi)型, 而變量沒(méi)有。一個(gè)例子:
a = 3 # a是一個(gè)整型數(shù)據(jù)
a = ‘spam’ # 現(xiàn)在是一個(gè)字符串了
a = 1.23 # 現(xiàn)在是一個(gè)浮點(diǎn)數(shù)了
在Python中,事情工作的很簡(jiǎn)單,再次強(qiáng)調(diào):Names沒(méi)有類(lèi)型;只有對(duì)象有類(lèi)型,而不是變量。
變量的命名規(guī)則:
只能包含字母、數(shù)字和下劃線
只能以字母或下劃線開(kāi)頭
不能是Python解釋器的保留字
共享引用
接下來(lái)我們看兩個(gè)變量同時(shí)指向一個(gè)對(duì)象的情況:
a = 3
b = a
現(xiàn)在,假設(shè)我們?cè)龠M(jìn)行如下的賦值語(yǔ)句:
a = 3
b = a
a = ‘spam’
現(xiàn)在變量a指向的對(duì)象spam。然而變量b卻依然指向?qū)ο?。賦值意味著創(chuàng)建了新的對(duì)象。
共享引用與原地改變
接下來(lái)要看的是有一些對(duì)象會(huì)進(jìn)行原地改變,那就是Python的可變對(duì)象,包括列表,字典及集合。對(duì)于一個(gè)支持原地改變的對(duì)象,我們需要知道共享引用,如果一個(gè)改變會(huì)影響其他的對(duì)象。還是看個(gè)例子吧:
L1 = [2, 3, 4]
L2 = L1
L1是一個(gè)列表且包含2、3、4三個(gè)對(duì)象。列表中的元素通過(guò)它們的位置進(jìn)行訪問(wèn),所以L1[0]指向?qū)ο?,它是列表L1的第一個(gè)對(duì)象。當(dāng)然列表也是一個(gè)對(duì)象,就像其他的整數(shù)與字符串。當(dāng)進(jìn)行上面的兩個(gè)賦值后,L1與L2都指向了同一個(gè)共享的對(duì)象。
現(xiàn)在,我們進(jìn)行如下的賦值:
L1 = 24
這個(gè)賦值語(yǔ)句簡(jiǎn)單地把L1指向了不同的對(duì)象;L2依然指向原來(lái)的列表。接下來(lái)我們進(jìn)行一些改變:
L1 = [2, 3, 4] # 一個(gè)可變的對(duì)象
L2 = L1 # L2與L1指向了同樣的對(duì)象
L1[0] = 24 # 一個(gè)原地改變的操作
L1 # L1已經(jīng)改變了
[24, 3, 4]
L2 # L2也是與L1相同
[24, 3, 4]
上面的例子中,我們并沒(méi)有改變L1對(duì)象本身,只是改變了L1中的一個(gè)對(duì)象。這種原地改變的操作的情況只出現(xiàn)在可變對(duì)象中。舉個(gè)字典的例子:
d1 = {‘a(chǎn)’: 1, ‘b’: 2}
d2 = d1
d1
{‘b’: 2, ‘a(chǎn)’: 1}
d2
{‘b’: 2, ‘a(chǎn)’: 1}
d1[‘a(chǎn)’] = ‘a(chǎn)’
d2
{‘b’: 2, ‘a(chǎn)’: ‘a(chǎn)’}
我們可以使用copy的方法:
L1 = [2, 3, 4]
L2 = L1[:] # 制作L1的拷貝
L1[0] = 24
L1
[24, 3, 4]
L2 # L2并沒(méi)有改變
[2, 3, 4]
通過(guò)上面的例子我們發(fā)現(xiàn),L1的改變并沒(méi)有影響L2,L2只是引用了L1的一份拷貝,并不是原來(lái)的L1自身,也就說(shuō),L1與L2指向了兩個(gè)不同的內(nèi)存空間。
接下來(lái)談?wù)摿硗庖粋€(gè)話題,Python會(huì)緩存小的整數(shù)及小的字符串。舉個(gè)例子吧:
L = [1, 2, 3]
M = L # M與L指向相同的對(duì)象
L == M # 具有相同的值
True
L is M # 依然相同
True
id(L)
4338913608
id(M)
4338913608
通過(guò)上面的例子,==判斷兩個(gè)引用的對(duì)象是否有相同的值;第二個(gè)操作符is是用來(lái)判斷對(duì)象id的,只有兩個(gè)names指向相同的對(duì)象,is比==判斷對(duì)象是否相同更強(qiáng)壯。is只是簡(jiǎn)單地比較兩個(gè)對(duì)象的指針。再看一個(gè)例子:
L = [1, 2, 3]
M = [1, 2, 3] # M與L指向不同的對(duì)象(賦值意味著產(chǎn)生新的對(duì)象)
L == M # 具有相同的值
True
L is M # 但是是不同的對(duì)象
False
id(L)
4338913480
id(M)
4338915208
評(píng)論
查看更多