這個blog是用來記錄python函式到底傳遞的是引用還是值
1. is 和 ==的區別
==是表示值相同,但是不一定是同一塊記憶體。而is是表示同一塊記憶體位址,則值肯定相同。
a =[1
,2,3
]b = a
print
('address of a: {}, address of b: {}'
.format(id
(a),
id(b)))
# address of a: 140262389525768, address of b: 140262389525768
# 所以可以看出a和b指向的是一塊記憶體,則 a is b
print
(a is b)
# true
a =
1b =
1print
("a==b ? {}, a is b ? {}"
.format
(a==b, a is b)
)# a==b ? true, a is b ? true
a =11111
b =11111
print
("a==b ? {}, a is b ? {}"
.format
(a==b, a is b)
)# a==b ? true, a is b ? true
# 目前嘗試了[-5, 無窮],都是使用的相同的記憶體。這是為了省記憶體,因為記憶體中只需要存在乙個變數。
# 同樣的字串也是,記憶體中只保留乙個變數。
總結:總結的不夠完善,需要專門去了解python快取池
1. 實際上,為什麼有些變數可以共用一塊記憶體呢,是因為python有緩衝池。
2. tuple到底能不能改變?
首先要明白tuple不可改變指的是,tuple中的元素不能進行賦值,舉例:
a =([
1],[
2])a[
0]+=[
2]print
(a)typeerror:
'tuple'
object does not support item assignment
# 在這個例子中,+=表示兩個過程,先加再賦值,
# 雖然a已經改變為([1, 2], [2]),但是還會報不能assign的錯誤(即使是同樣的位址)
# 說明加是沒有報錯的。
a =([
1],[
2])a[
0]2)
print
(a)# ([1, 2], [2])
3. 變數的本質
在python中,變數也是物件的引用,變數儲存的是物件的位址
變數位於棧記憶體
物件位於堆記憶體
變數相當於物件的門牌號,或者是引用。變數可以通過這個引用來改變物件的值,也可以通過這個引用訪問物件。
4. 函式傳遞是引用傳遞
結論: 實際上函式的傳遞,不管是可變變數還是不可變變數,傳遞的都是引用
def
print_variable_id
(a):
print(.
format(id
(a))
)a =[1
,2,3
]# 可變物件
b =-
55# 不可變物件
print
('a的地位址為 {}'
.format(id
(a))
)print_variable_id(a)
print
('b的位址為{}'
.format(id
(b))
)print_variable_id(b)
def
print_variable_id
(a):
a =2print(.
format(id
(a))
)a =
1print
('a的位址為 {}'
.format(id
(a))
)print_variable(a)
print
('呼叫函式後,a的位址為 {}'
.format(id
(a))
)a的位址為 10853632
呼叫函式後,a的位址為 10853632
首先要搞明白的是assign在python中是什麼含義,assign表示變數和物件進行繫結,是換了指向,即使是可變變數也是一樣的,如果在函式中進行賦值,函式外的變數也不會改變的。
def
print_variable_id
(a):
a =2# 賦值會改變變數的位址。
print(.
format(id
(a))
)a =[1
,2,3
]print
('a的位址為 {}'
.format(id
(a))
)print_variable_id(a)
print
('呼叫函式後,a的位址為 {}'
.format(id
(a))
)
而如果通過引用變數進行修改可變變數則結果就會變化,
def
print_variable_id
(a):
a[2]
=10000
# 原地進行修改,不改變變數的位址
print(.
format(id
(a))
)a =[1
,2,3
]print
('a的位址為 {}'
.format(id
(a))
)print_variable_id(a)
print
('呼叫函式後,a的位址為 {}'
.format(id
(a))
)a的位址為 140527304391944
呼叫函式後,a的位址為 140527304391944
python函式是值傳遞還是引用傳遞
在網上看python的基礎知識,看到函式這一章的時候,看到這麼一段話 所有引數 自變數 在python裡都是按引用傳遞。如果你在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了。def changeme mylist 修改傳入的列表 print 函式內取值 mylist retur...
Python值傳遞還是引用傳遞
python作為一門動態語言,變數本身的型別是不固定的,因此更加靈活。那python到底是值傳遞還是引用傳遞呢?本人在本週寫 時,遇到這麼乙個讓我注意的問題,問題可以抽象如下 def func val1 val2 val1 a 一系列對a的操作 b a func a print b 當我執行上述後,...
java中函式是值傳遞還是引用傳遞?
先看乙個例子 public class test1 static void changenum int a 結果 changenum a 100 main a 10 說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。再看...