8 python函式傳遞值還是引用

2021-10-04 06:39:48 字數 3152 閱讀 5137

這個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 說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。再看...