1. 程式人生 > >【python小課堂專欄】python面試最常見的一個知識點

【python小課堂專欄】python面試最常見的一個知識點

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的id1467051488
>>> a=2之後a的id1467051520 >>> 數字2id1467051520 >>> 函式外面a的id1467051488 >>> 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的id1989582375944
>>> b.append之後b的id1989582375944
>>> 函式外面b的id1989582375944
>>> 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的同學,歡迎交流,公眾號:
在這裡插入圖片描述