這個世界其實從不曾有乙個人能取代另乙個人的位置,所謂的取代,只是以前的那個人被遺忘了。
普通傳參的小坑def test(a=):
return a
print test()
print test()
print test()
返回的結果:
['a']
['a', 'a']
['a', 'a', 'a']
原因:傳入的引數是乙個空的列表,python遇到函式的時候會把函式讀到記憶體中,預設引數會被建立。雖然函式沒有執行,但是其中賦值建立變數,並且建立好了。a始終沒有改變,指向的記憶體方向都是同乙個記憶體。
使用id()可以檢視函式內部在記憶體中的位址。
def test(a=):
print id(a)
return a
print test()
print test()
print test()
返回結果:
['a']
['a', 'a']
['a', 'a', 'a']
可以看到指向記憶體的位置都沒變。
這裡引申一下python的可變物件和不可變物件,dict,list是可變物件,str,int,tuple,float是不可變物件。意思就是可變物件的值改變後對應的記憶體位址沒改變。但是不可變物件改變量值後,就會創立乙個新的物件並且占用新的記憶體空間。所以一般如果想要把乙個列表的所有元素拼接成乙個字串的話,遍歷這個列表沒然後使用』』.join()方法,節省記憶體。
如果想要每次都是變成空的列表可以這樣寫。
def test_new(a=none):
if a is none:
a=print id(a)
return a
print test_new()
print test_new()
print test_new()
記住,對應的記憶體位址任然是一樣的。
返回結果:
['a']
['a']
['a']
動態引數
python的動態引數有*args與**kwargs。 *args表示任何多個無名引數,它是乙個tuple。**kwargs表示關鍵字引數,它是乙個dict。
*args的用法def fun(*args):
for x in args:
print x
fun(1,2,3)
返回結果:
當然還可以傳入列表,但是傳入列表的時候必須要在前面加上*號。比如:
li=[1,2,3,4,5]
fun(*li)
返回結果:
**kwargs的用法def fun_test(**kwargs):
for x in kwargs:
print x,kwargs[x]
fun_test(k1=1,k2=[1,2,3])
返回結果:
k2 [1, 2, 3]
k1 1
當然還可以傳入字典,使用方法和上面一致,也是加上兩個*號。
dubbo 攔截入參
建立 dubbo 的filter com.alibaba.dubbo.rpc.filter import com.alibaba.dubbo.common.constants import com.alibaba.dubbo.common.extension.activate import com....
springMvc 入參物件
1.修改或者新增物件 2.多添件查詢時候也會遇到 springmvc能夠根據屬性自動的封裝pojo的物件並且支援關聯的物件 大致的原理是在傳入後台的時候把前台的屬性和物件封裝成json的形式傳入後台,後台根據傳入的物件,把json的形式轉換為物件進行處理 具體使用 package com.atgui...
Python函式傳參
首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...