python對於字串和數字作為引數傳遞時,在函式中的值就是直接複製了乙個。就像下面這個例子,a和b的位址是同乙個但是改變a的值,b的值不會發生改變。
a =
1b =
1print
("a"
,a,id
(a),
"b",b,
id(b))a=
2print
("a"
,a,id
(a),
"b",b,
id(b)
)#####輸出結果######
a 194378359581376 b 1
94378359581376
a 294378359581408 b 1
94378359581376
在函式內修改時程式會生成乙個新的記憶體位址儲存新的值,所有操作都是在函式內部操作僅僅是區域性變數,由於是值傳遞,所以該函式的對該值所有操作都僅限於該函式內,並沒有對引數t1進行修改。詳情看下面的例項**。
def
test
(a):
print
('a'
, a,
"記憶體位址",id
(a))
a +=
"qq"
print
('a'
, a,
"記憶體位址",id
(a))
a +=
"ww"
print
('a'
, a,
"記憶體位址",id
(a))
if __name__ ==
'__main__'
: t1 =
"aaaa"
print
("記憶體位址",id
(t1)
) test(t1)
print
('t1'
, t1,
"記憶體位址",id
(t1)
)
#######執行結果#######
記憶體位址 140572064233208
a aaaa 記憶體位址 140572064233208
a aaaaqq 記憶體位址 140572064249032
a aaaaqqww 記憶體位址 140572063338224
t1 aaaa 記憶體位址 140572064233208
process finished with exit code 0
但是當引數為乙個列表時,就又會不同。
def
test1
(b):
print
("b"
, b,
"記憶體位址",id
(b))6)
print
("b"
, b,
"記憶體位址",id
(b))
if __name__ ==
'__main__'
: t2 =[1
,2,3
,4,5
]print
("t2"
, t2,
"記憶體位址",id
(t2)
) test1(t2)
print
("t2"
, t2,
"記憶體位址",id
(t2)
)
#######執行結果##########
t2 [1,
2,3,
4,5] 記憶體位址 139999401054088
b [1,2
,3,4
,5] 記憶體位址 139999401054088
b [1,2
,3,4
,5,6
] 記憶體位址 139999401054088
t2 [1,
2,3,
4,5,
6] 記憶體位址 139999401054088
process finished with exit code 0
由上面的**可以看出經過函式的修改t2的值發生改變,但是記憶體位址沒有發生改變,這就相當與c語言中的指標一樣,只是把引用傳遞過去,函式通過引用可以直接操作該值.
簡單來說,可以通過函式來直接改變引數的傳值為引用傳值,反之就是值傳遞
golang的值傳遞和引用傳遞
s 3 int func v 3 int s fmt.println s 引數固定長度陣列是值傳遞 輸出1 2 4 func v int s fmt.println s 引數非固定長度是切片是引用傳遞 輸出0 2 4 m map int int func v map int int m fmt.pr...
值的傳遞和引用傳遞
1 值型別和引用型別分別是什麼意思 區別是什麼 值型別 一些基礎型別,比如 基本資料型別 引用型別 string 物件 陣列等 區別 值型別操作的記憶體是分開的,引用型別實際操作時同一塊記憶體 2 什麼時裝箱 拆箱 大轉小 拆箱 小轉大 裝箱 裝箱是自動的 比如 int i 1 object o i...
值傳遞和引用傳遞
幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...