前幾天在做專案的過程中發現了乙個問題,向函式中傳入乙個list,在函式體內將其賦值給list,對list1操作後發現list也發生了變化,啊 ! 出乎意料。查了一下原因,原來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]
要想不改變原list,用copy.deepcopy()
import copy
def change2(list):
list1=copy.deepcopy(list)
mylist = ["aa",21]
print mylist
change2(mylist)
print mylist
結果:
['aa', 21]
['aa', 21]
要想改變bool型,將其作為返回值flag不做返回值,函式外不發生改變
flag=true
def change2(list,flag):
flag=false
mylist = ["aa",21]
print mylist
change2(mylist,flag)
print mylist,flag
結果:
['aa', 21]
['aa', 21, 34] true
flag作為返回值,返回值可用,但函式仍然不發生改變
flag=true
def change2(list,flag):
flag=false
return flag
mylist = ["aa",21]
print mylist
print change2(mylist,flag)
print mylist,flag
輸出結果:
['aa', 21]
false
['aa', 21, 34] true
Python改變引數值的函式
例1 銀行賬戶計算利率 賬戶餘額計算利息的函式 def addinterest balance,rate newbalance balance 1 rate balance newbalance def main amount 1000 rate 0.05 addinterest amount,ra...
python函式的引數問題
函式的定義方式 def 函式名 塊函式的呼叫方式 函式名 上面是最簡單的無引數函式。函式高階,就是帶有引數的函式,樣例如下 def demo x,y return x y 呼叫方式 print demo 1,2 輸出3demo函式做只做了兩個引數的加法運算。python的引數如下幾種 1.必須引數 ...
python引數函式 Python函式引數總結
coding utf 8 整理一下python函式的各種引數型別 位置引數 呼叫函式時,傳入的兩個值按照位置順序依次賦給引數 def power x,n s 1 while n 0 n n 1 s s x return s print power 5,2 預設引數 簡化函式的呼叫 def power...