python函数在传参的时候,到底在传些什么?
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                python函数在传参的时候,到底在传些什么?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                C++這樣的語言用多了之后,在Python函數傳遞參數的時候,經常會遇到一個問題,我要傳遞一個引用怎么辦? 
 比如我們想要傳一個x到函數中做個運算改變x的值:
得到的結果是
before change: 1 after change: 1完全沒用~~~這是怎么回事? 
 我來說明一下這個過程~ 
 
也就是說python中的等號就是把變量指向了一個實例而已。
那么,如何做到其它語言中引用這樣的效果呢?一個比較推薦的方法就是用把參數return回去就可以了,如下面代碼所示。 def change(y):y += 1return yx = 1 print ("before change:", x) x = change(x) print ("after change: ", x)
結果為
before change: 1 after change: 2另一種方法就是,我們不讓函數中的參數指向新的地址不就可以了,我們讓它在原來的地址上修改我們的值。這一點,只有一部分的數據類型可以做到,我們把這樣的對象叫做可變對象,做不到的就叫不可變對象。
- 不可變對象:int,string,float,tuple 等
- 可變對象 :list,dictionary 等
舉幾個例子更為通俗易懂
def change(x):print ("before append:", x, "id:", id(x))x.append(0)print ("after append:", x, "id:", id(x))x = [1, 2, 3] print ("before change:", x, "id:", id(x)) change(x) print ("after change:", x, "id:", id(x)) before change: [1, 2, 3] id: 140623459512008 before append: [1, 2, 3] id: 140623459512008 after append: [1, 2, 3, 0] id: 140623459512008 after change: [1, 2, 3, 0] id: 140623459512008由于list在做append操作時,x指向的地址是不變的,所以可以有引用的效果,x[0] = 4這樣的操作也是沒問題的 
 然而,如果是把x指向了新的地址就不行了,如下
這下應該就搞清楚是怎么回事了吧,不過正是因為python的這種特性,在函數設置默認參數的時候,我們要注意盡量不用可變對象當默認值,否則會發(fā)生下面這種情況
def change(x=[]):x.append(1)return xprint (change()) print (change()) [1] [1, 1]比較妥當的做法是用不可變對象來代替[],比如None
def change(x=None):if not x:x = []x.append(1)return xprint (change()) print (change())此時的輸出為
[1] [1]總結
以上是生活随笔為你收集整理的python函数在传参的时候,到底在传些什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 从LeetCode 210. Cours
- 下一篇: LeetCode 1974. 使用特殊打
