|
導(dǎo)讀:Python中不明確區(qū)分賦值和應(yīng)用,一般對(duì)靜態(tài)變量的傳遞為賦值,對(duì)動(dòng)態(tài)變量的傳遞為引用。(注,對(duì)靜態(tài)變量首次傳遞時(shí)也是應(yīng)用,當(dāng)需要修改靜態(tài)變量時(shí),因?yàn)殪o態(tài)變量不能改變,所以需要生成一個(gè)新的空間存儲(chǔ)數(shù)據(jù))個(gè)人覺得分清楚規(guī)則即可比較容易的區(qū)別。 Python中不明確區(qū)分賦值和應(yīng)用,一般對(duì)靜態(tài)變量的傳遞為賦值,對(duì)動(dòng)態(tài)變量的傳遞為引用。(注,對(duì)靜態(tài)變量首次傳遞時(shí)也是應(yīng)用,當(dāng)需要修改靜態(tài)變量時(shí),因?yàn)殪o態(tài)變量不能改變,所以需要生成一個(gè)新的空間存儲(chǔ)數(shù)據(jù))個(gè)人覺得分清楚規(guī)則即可比較容易的區(qū)別。 字符串,整數(shù),元組均為靜態(tài)變量 列表,字典為動(dòng)態(tài)變量。 以下示例在Python 2.7環(huán)境下演示,id()函數(shù)可顯示變量內(nèi)存地址 例1:整數(shù)傳遞a = 4print id(a) #id函數(shù)顯示變量內(nèi)存地址 b = a print id(b) b = 6 print id(b) >>> 19691376 19691376 19691328 說(shuō)明, 例2:變量傳遞a = "mm"print id(a) b = a print id(b) b = "nn" print id(b) >>> 37313312 37313312 37313352 說(shuō)明: 1.a為一個(gè)指向字符串的變量名 2.a傳遞給b時(shí),b為一個(gè)引用指向和a相同的地址 3.當(dāng)b被賦給一個(gè)新字符串值時(shí),因?yàn)閎指向的"mm"是一個(gè)靜態(tài)變量,所以生成一個(gè)新空間存放"nn",然后b指向"nn" 例3:列表的地址存儲(chǔ)(以下為個(gè)人理解,未查源代碼,如有錯(cuò)誤請(qǐng)指正)>>> 說(shuō)明: 從輸出的1,2,3行看出,a的地址>a[0]的地址>a[1]的地址,而且a[0]和a[1]地址間相差較遠(yuǎn),所以python中的列表絕對(duì)不是c中的數(shù)組,應(yīng)該是個(gè)鏈表。(從python列表具有append()函數(shù)也可以看出) 命令第5行a傳遞給b時(shí),從輸出6,7行看,a和b指向了同一個(gè)地址,b為a的一個(gè)引用,a,b的值應(yīng)該是指向鏈表頭的指針。 命令第6行,b[0]值發(fā)生改變,從輸出4,5行看,a,b內(nèi)容同時(shí)都發(fā)生改變,從輸出6,7行a,b指向的還是同一個(gè)地址,從輸出7行看a[0]的地址發(fā)生了改變,所以應(yīng)該時(shí)鏈表的第一個(gè)節(jié)點(diǎn)被替換(即使變量類型兼容),所以也可以理解為什么python可以不關(guān)注變量類型。輸出第8行為a[1]的地址,沒有發(fā)生改變 命令第13行,b[1]被改變,分析同上,a,b指向的同一個(gè)鏈表的尾元素被替換 例4:列表傳遞(引用)a = [4]print id(a) b = a print id(b) b[0] = 6 print id(b) >>> 43351720 43351720 43351720 說(shuō)明; 同上例理解 例5:列表賦值a = [4]print id(a) b = a[:] print id(b) b[0] = 8 print id(b) >>> 22863528 23030888 23030888 說(shuō)明: 1.a指向一個(gè)動(dòng)態(tài)變量列表 2.b得到a列表的一個(gè)copy存儲(chǔ)在一個(gè)新的空間,b指向一個(gè)新地址(b = a 和b=a[:]的區(qū)別可從 ,b=a,b=a[1:3]的區(qū)別進(jìn)行理解) 3.b的第一個(gè)元素賦值8,不影響a 例6:字典引用a = {"i":99}print id(a) b = a print id(b) b["o"] = 8 print id(b) print "a=", a print "b=", b >>> 28841616 28841616 28841616 a= {'i': 99, 'o': 8} b= {'i': 99, 'o': 8} 說(shuō)明: 1.a指向一個(gè)動(dòng)態(tài)變量 2.b為a的一個(gè)引用 3.b新增了一個(gè)變兩,a也新增 例7:字典賦值a = {"i":99}print id(a) b = a.copy() print id(b) b["o"] = 8 print id(b) print "a=", a print "b=", b >>> 16033424 16063424 16063424 a= {'i': 99} b= {'i': 99, 'o': 8} 說(shuō)明: 1.a指向一個(gè)動(dòng)態(tài)變量 2.b為a的一個(gè)拷貝,指向一個(gè)新地址 3.b新增了一個(gè)變量,a不變 例8:不同類型變量傳遞a = "mm" >>> 11687096 說(shuō)明: 1.a指向一個(gè)靜態(tài) 2.b為a的一個(gè)應(yīng)用,指向和a相同的地址 3.b發(fā)生了改變,指向一個(gè)新的數(shù)據(jù)地址
總結(jié):a = "mm"print id(a)b = aprint id(b)b = 8print id(b)print "a=", aprint "b=", b
|
|
|