前言
今天和師弟一起討論問題脯燃,學(xué)到了很多帮辟,遂記錄一下,也明白了一個(gè)人絕對(duì)不可能學(xué)完所有的知識(shí)龄糊,多和別人溝通是非常有效的學(xué)習(xí)方式逆粹!
問題起源:數(shù)組賦值
a=[1,2,3]
b=a
b[0]=5
print(a)
猜猜看 a 輸出是多少?
a=[5,2,3]
再來(lái)看一個(gè)
a=1
b=a
b=5
print(a)
猜猜看 a 輸出是多少炫惩?
a=1
為什么會(huì)出現(xiàn)這樣的情況呢僻弹?同樣是修改b,為什么列表的a變了他嚷,而int的a不變呢蹋绽?
首先我們要明白在python中存在可變和不可變數(shù)據(jù)類型,可變數(shù)據(jù)類型有列表和字典筋蓖,不可變數(shù)據(jù)類型有整型蟋字、字符、字符串扭勉、元組鹊奖。可變和不可變的意思是什么涂炎,區(qū)別是什么呢忠聚?
a=[1,2,3]
b=[1,2,3]
c=1
d=1
print(id(a)==id(b))
print(id(c)==id(d))
運(yùn)行這段代碼會(huì)發(fā)現(xiàn),第一個(gè)輸出False唱捣,第二個(gè)輸出True两蟀,這就可以看出區(qū)別了,對(duì)于整型變量而言震缭,只要它們的值相同赂毯,那么無(wú)論有多少個(gè)變量指向這個(gè)值,這些變量的id都相同拣宰,但是對(duì)于列表而言党涕,值相同,變量的id不一定相同巡社。但是用“=”賦值膛堤,“=”兩邊的變量的地址是一樣的,指向的內(nèi)容也是一樣的晌该,所以你無(wú)論如何改變列表中的元素值肥荔,最終這兩個(gè)變量的地址都指向同一個(gè)列表绿渣,這就解釋了上面改變一個(gè)列表的元素,另一個(gè)列表為什么也變了燕耿。而對(duì)于整型數(shù)據(jù)中符,只要內(nèi)容不一樣,那么變量的地址一定不一樣誉帅,所以你讓b=5之后舟茶,b有新的地址,已經(jīng)不指向1了堵第,而a仍然指向1,所以改變b無(wú)法影響a隧出。也就是說(shuō)最關(guān)鍵的在于可變和不可變的理解踏志,不可變數(shù)據(jù)類型指的是相同的值無(wú)論有多少個(gè)變量指向它,變量的id都是相同的(但是元組并不是這樣胀瞪,我也不知道為什么)针余,而可變數(shù)據(jù)類型則是不同的變量指向相同的值,它們的id也不相同凄诞。