??????? 接上昨天的話題皱埠,一個字典對象dict1的值賦給另一個字典對象dict2欠母,若dict2的值發(fā)生改變,那么dict1的值也會隨之改變,這與我們潛意識中的變量賦值有沖突推姻,我覺得有必要總結一下python中對象賦值是怎么樣一回事平匈。
不可變對象的賦值
????? 不可變對象包括字符串,元組,字符串增炭,先看一個簡單的例子:
?????? 簡述一下過程:1忍燥、創(chuàng)建一個變量b,并賦值為10隙姿,再創(chuàng)建一個變量a梅垄,并把變量b的值賦給變量a;2输玷、打印變量a和b的內存地址队丝,發(fā)現其占用同一個內存地址;3欲鹏、將20重新賦給變量a机久,然后打印b的值,發(fā)現b的值并沒有隨著a改變赔嚎。為什么呢膘盖?其實可以這樣理解:對于python來講,變量的賦值其實是創(chuàng)建新變量的過程尤误,變量a被重新賦值為20后侠畔,其實是內存為其新分配了一個地址,稱為了一個全新的變量损晤,而原來的那個變量a被python的垃圾處理機制所回收软棺,我們重新打印a和b所占用的內存地址,發(fā)現確實如此:
???? 也可以用下面的圖進行解釋:
??? 因此沉馆,對python不可變對象的賦值根據理解總結如下:
??? 1码党、python的不可變對象賦值也就是現在內存中創(chuàng)建存儲這個值的地址空間,再用一個標識來代表它斥黑。
??? 2揖盘、python不可變對象的傳遞其實就是引用的傳遞。
??? 3锌奴、創(chuàng)建新值就是創(chuàng)建新的內存兽狭,也即創(chuàng)建新的對象。
可變對象的賦值
????? 那么對象的賦值又有何不同鹿蜀,同樣舉一個簡單的例子:
???? 簡述一下上述過程:1箕慧、創(chuàng)建一個列表list1;2茴恰、把list1值賦給list2颠焦;3、在list1中增添一個元素往枣;4伐庭、打印list2的值粉渠,發(fā)現list2的值也隨之發(fā)生了改變。
????? 打印list1和list2的內存發(fā)現其占用同一個內存地址圾另。
??? 同樣可以用如下的圖進行解釋:
??? 因此對可變對象的賦值做如下總結:
??? 1霸株、可變對象的改變只是改變對象的內容,而不改變其占用的內存地址集乔。
??? 2去件、對象的賦值只是引用的傳遞,引用永遠指向對象所在的內存地址扰路。
???