【python小課堂專欄】python面試最常見的一個知識點
阿新 • • 發佈:2019-01-08
python面試最常見的一個知識點
前言
今天呢分享一個在python中面試最常見到的一個知識點,非常基礎,對於剛學習的人來說也會經常弄錯 ---- python語言特性的函式引數傳遞,實際上在早期的小課堂中,有分享過,這裡用例子說明下,相信實踐出真理。
示例
例子1:
a = 1
""" 例子1:問 a 的值最終是多少? """
def fun_a(a):
a = 2
fun_a(a)
例子2:
b = []
""" 例子2:b是一個列表,問,b的值是多少?"""
def fun_b(b):
b.append(1)
fun_b( b)
根據id對比以及列印得出結論
對於上面的兩個小例子,我們可以通過下面的方式來親手驗證下:
例1:
a = 1
""" 例子1:函式a,a為int """
def fun_a(a):
print(f'函式中形參a的id:{id(a)}')
a = 2
print(f'a=2之後a的id:{id(a)}')
print(f'數字2的id:{id(2)}')
fun_a(a)
print(f'函式外面a的id:{id(a)}')
print(f'a的值:{a}')
結果輸出:
>>> 函式中形參a的id:1467051488
>>> a=2之後a的id:1467051520
>>> 數字2的id:1467051520
>>> 函式外面a的id:1467051488
>>> a的值:1
例2:
b = []
""" 例子2:函式b,b為list """
def fun_b(b):
print(f'函式中形參b的id:{id(b)}')
b.append(1)
print(f'b.append之後b的id:{id(b)}')
fun_b(b)
print(f'函式外面b的id:{id(b)}')
print(f'b的值:{b}' )
輸出結果:
>>> 函式中形參b的id:1989582375944
>>> b.append之後b的id:1989582375944
>>> 函式外面b的id:1989582375944
>>> b的值:[1]
原理及總結
str為不可變物件,list為可變物件。在python中,str、 tuples、和numbers是不可更改的物件,而 list, dict, set 等則是可以修改的物件。(這就是這個問題的重點)
這麼說可能還是不太明白,用白話解釋一下:
例子1:
當一個引用a傳遞給函式fun_a的時候,函式會自動複製一份引用a(可以參考列印輸出的id記憶體地址),這個函式裡的引用a和外邊的引用a沒有半毛關係,記憶體地址就不一樣!也就是說函式fun_a把引用指向了一個不可變物件nums、str,所以不會影響到函式外面的同名變數。
例子2:
函式內的引用指向的是可變物件list,對它的操作就和定位了指標地址一樣,在記憶體裡進行修改。可以看到對list進行append操作記憶體地址無論是在函式內還是函式外都是不變的!
至此完!
有想學習python的同學,歡迎交流,公眾號: