python中不明確區分賦值和應用,一般對靜態變數的傳遞為賦值,對動態變數的傳遞為引用。(注,對靜態變數首次傳遞時也是應用,當需要修改靜態變數時,因為靜態變數不能改變,所以需要生成乙個新的空間儲存資料)個人覺得分清楚規則即可比較容易的區別。
字串,整數,元組均為靜態變數
列表,字典為動態變數。
以下示例在python 2.7環境下演示,id()函式可顯示變數記憶體位址
a = 4
print id(a)
#id函式顯示變數記憶體位址
b = a
print id(b)
b = 6
print id(b)
>>>
19691376
19691376
19691328
說明,1.a被賦值4
2.b是a的引用
3.b改變,因為此時b指向的是乙個靜態變數4,所以給b賦值時,先將6存入乙個和4不同的位址,然後b再指向6的位址
a = "mm"
print id(a)
b = a
print id(b)
b = "nn"
print id(b)
>>>
37313312
37313312
37313352
說明:1.a為乙個指向字串的變數名
2.a傳遞給b時,b為乙個引用指向和a相同的位址
3.當b被賦給乙個新字串值時,因為b指向的"mm"是乙個靜態變數,所以生成乙個新空間存放"nn",然後b指向"nn"
a = [4, 5]
print "address a=", id(a)
print "address a0=", id(a[0])
print "address a1=", id(a[1])
b = a
b[0] = 6
print "a=", a
print "b=", b
print "address a=", id(a)
print "address b=", id(b)
print "address a0=", id(a[0])
print "address a1=", id(a[1])
b[1] = "str"
print "a=", a
print "b=", b
print "address a=", id(a)
print "address b=", id(b)
print "address a0=", id(a[0])
print "address a1=", id(a[1])
address a= 24415912
address a0= 23648112
address a1= 23648088
a= [6, 5]
b= [6, 5]
address a= 24415912
address b= 24415912
address a0= 23648064
address a1= 23648088
a= [6, 'str']
b= [6, 'str']
address a= 24415912
address b= 24415912
address a0= 23648064
address a1= 140688190862360
說明:命令第5行a傳遞給b時,從輸出6,7行看,a和b指向了同乙個位址,b為a的乙個引用,a,b的值應該是指向煉表頭的指標。
命令第6行,b[0]值發生改變,從輸出4,5行看,a,b內容同時都發生改變,從輸出6,7行a,b指向的還是同乙個位址,從輸出7行看a[0]的位址發生了改變,所以應該時鍊錶的第乙個節點被替換(即使變數型別相容),所以也可以理解為什麼python可以不關注變數型別。輸出第8行為a[1]的位址,沒有發生改變
命令第13行,b[1]被改變,分析同上,a,b指向的同乙個鍊錶的尾元素被替換
a = [4]
print id(a)
b = a
print id(b)
b[0] = 6
print id(b)
>>>
43351720
43351720
43351720
說明;同上例理解
a = [4]
print id(a)
b = a[:]
print id(b)
b[0] = 8
print id(b)
>>>
22863528
23030888
23030888
說明:1.a指向乙個動態變數列表
2.b得到a列表的乙個copy儲存在乙個新的空間,b指向乙個新位址(b = a 和b=a[:]的區別可從 ,b=a,b=a[1:3]的區別進行理解)
3.b的第乙個元素賦值8,不影響a
a =
print id(a)
b = a
print id(b)
b["o"] = 8
print id(b)
print "a=", a
print "b=", b
>>>
28841616
28841616
28841616
a= b=
說明:1.a指向乙個動態變數
2.b為a的乙個引用
3.b新增了乙個變兩,a也新增
a =
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= b=
說明:1.a指向乙個動態變數
2.b為a的乙個拷貝,指向乙個新位址
3.b新增了乙個變數,a不變
a = "mm"
print id(a)
b = a
print id(b)
b = 8
print id(b)
print "a=", a
print "b=", b
11687096
11687096
10692368
a= mm
b= 8
說明:1.a指向乙個靜態
2.b為a的乙個應用,指向和a相同的位址
3.b發生了改變,指向乙個新的資料位址
Python中實現變數賦值傳遞時的引用和拷貝方法
iamlaosong文 曾經看到這樣乙個問題,乙個字典中的元素是列表,將這個列表元素賦值給乙個變數,然後修改這個列表中元素的值,結果發現,字典中那個列表也同樣修改了。那個問題如下 dict x dict a for i in range 5 x i 0 print dict a 程式執行結果如下 0...
python變數傳遞 python變數傳遞
python變數傳遞 數值 num 1 123 num 2 num 1 改變num 2值前 print num 1 num 2 format num 1,num 2 num 2 0 改變num 2值後 print num 1 num 2 format num 1,num 2 輸出num 1 123,...
python傳遞變數 python變數傳遞
python變數傳遞 數值 num 1 123 num 2 num 1 改變num 2值前 print num 1 num 2 format num 1,num 2 num 2 0 改變num 2值後 print num 1 num 2 format num 1,num 2 輸出num 1 123,...