python學習 python函式引數變化問題

2021-08-26 17:47:46 字數 1908 閱讀 5857

昨天寫leetcode的時候,發現python跟c++不一樣的地方,導致思路沒有錯,**執行就報錯。

參考部落格:

入門學習程式設計的時候,我們都學過swap函式,就是傳入兩個引數,交換兩個引數,這個swap函式在c語言中給我們的警示是函式內改變傳入的引數值是不會改變函式外的值,如果不用引用和指標的話。但是在python中,有可變物件和不可變物件之分。只有傳入的是不可變物件時,值才不發生改變,若是可變物件,充當函式引數時要注意了。

不可變物件:number ,string , tuple,bool

可變物件: list , set , dictionary是可以改變內部的元素

先看例子:

def changestr (str):

str = "inside"

print "這是function中 , 值為:",str

mystr = "outside"

changestr(mystr)

print "這是函式外邊 , 值為:",mystr

輸出結果:

這是function中 , 值為: inside

這是函式外邊 , 值為: outside

即 傳入不可變物件字串,在函式內對其操作不影響呼叫結束後字串的值,即不發生改變。

ps: number和tuple結果是一樣的,這三種型別只能通過重新賦值來改變物件的值 .

def changestr (str):

print "這是function中 , 值為:",str

mystr = [1,2]

changestr(mystr)

print "這是函式外邊 , 值為:",mystr

結果:

這是function中 , 值為: [1, 2, 3]

這是函式外邊 , 值為: [1, 2, 3]

def change2(list):

list = [1,2,3,4]

mylist = ["aa",21]

print(mylist)

change2(mylist)

print(mylist)

輸出結果:

['aa', 21]

['aa', 21]

可變物件在函式體中的重新賦值 , 沒有對外部變數的值產生影響 , 不過仔細一想 , 卻又在情理之中 .

def change2(list):

list1 =list

mylist = ["aa",21]

print mylist

change2(mylist)

print mylist

輸出結果:

['aa', 21]

['aa', 21, 34]

根據上述幾個例子,可以看出python中的不可變物件傳值相當於c語言中的值傳遞,函式體內的改變不會改變函式體外的值。

可變物件傳值相當於c語言中的指標傳遞,函式體內的改變會改變函式體外的值。如果python中函式體內有乙個變數和函式體的引數名一樣,這時候也不會改變,畢竟傳入的引數和函式體內的變數的位址不一樣。

解決方法

temp1 = copy.deepcopy(temp)
這樣就可以深度複製temp中的值到temp1中了,這樣可變物件傳入的時候,函式體內的改變就不會影響函式體外了。

python學習筆記(二) python基礎函式

python之所以強大好用,離不開可以呼叫的各種庫,同時也和他自身函式相關,下面為學習python函式相關知識後整理知識點。1 python函式引數 python函式定義簡單但靈活度非常大。除正常定義的必選引數外,還可以使用預設引數,可變引數,關鍵字引數。預設引數 def power 5 x 2 在...

Python 學習筆記 enumerate函式

enumerate 函式用於將乙個可遍歷的資料物件 如列表 元組或字串 組合為乙個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。seasons spring summer fall winter list enumerate seasons 0,spring 1,summer 2,f...

python函式學習內容 python之函式學習

usr bin env python 位置引數說明 位置引數 通過引數傳遞的位置來決定 def echo1 x,y print x format x print y format y return x y res1 echo1 2,6 print res1 關鍵字引數 關鍵字引數 通過引數名稱來決定...