Python中變數傳遞時的引用和賦值

2021-06-04 12:36:22 字數 3303 閱讀 6385

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,...