python的預設引數 Python 預設引數的坑

2021-10-17 02:16:24 字數 1493 閱讀 5488

話不多說,上**:

def fun(x, a=, b=''):

c =

b = b + x

print(f"a: b: c:")

fun('1')

fun('2')

fun('3')

我們在這段**中:

定義了乙個位置引數 x,乙個乙個預設引數 a,a 的預設值為空列表,另乙個預設引數 b,b 的預設值為乙個空字串,在函式體中定義了乙個變數 c,並也給 c 傳遞了乙個空列表。

大家猜猜函式執行會輸出怎樣乙個結果?

# 為了排版工整略微修改了一下輸出樣式

a:['1'] b:1 c:['1']

a:['1', '2'] b:2 c:['2']

a:['1', '2', '3'] b:3 c:['3']

大家猜到了這個結果了嗎?猜到的朋友都是大佬,下面的內容就可以略過了。沒有猜到的朋友也不要慌,畢竟這玩意兒有點坑。。。

可變物件:物件指向的記憶體中的值會改變,當更改這個變數的時候,還是指向原來記憶體中的值,並且在原來的記憶體值進行原地修改,並沒有開闢新的記憶體(list、dict、set);

不可變物件:物件所指向的記憶體中的值不能被改變,當改變這個變數的時候,原來指向的記憶體中的值不變,變數不再指向原來的值,而是開闢一塊新的記憶體,變數指向新的記憶體(int、float、str、tuple、bool、none)。

概念複習完了就開始進入正題了:

在python程式中,函式在被定義建立時,python就會為預設引數分配一塊兒空間。在這個程式中,為預設變數 a 分配了乙個記憶體位址,其中的值為乙個空列表,為 b 也分配了一塊兒空間,值為空字串:

python 在呼叫函式時,會直接將在函式定義時得到的記憶體位址複製給預設引數!

當第一次呼叫函式時:

# 呼叫開始時: a指向0x0001這個位址,b指向0x0002這個位址

c = # 物件c指向乙個空列表

print(f"a: b: c:") # a:['1'] b:'1' c:['1']

函式執行完後記憶體指向:

當第二次呼叫函式時:

# 呼叫開始時: a指向0x0001這個位址,b指向0x0002這個位址

c = # 物件c指向乙個空列表

print(f"a: b: c:") # a:['1', '2'] b:'2' c:['2']

函式執行完後記憶體指向:

當第三次呼叫函式時:

# 呼叫開始時: a指向0x0001這個位址,b指向0x0002這個位址

c = # 物件c指向乙個空列表

print(f"a: b: c:") # a:['1', '2', '3'] b:'3' c:['3']

函式執行完後記憶體指向:

經過俺的這番講解,朋友們你們學廢了嗎?

為了避免以後在程式**現莫名其妙的 bug,大家要記住在 python 程式中

預設引數的值應該為不可變物件!!!

預設引數的值應該為不可變物件!!!

預設引數的值應該為不可變物件!!!

python 預設引數 Python預設引數有坑?

最近有小夥伴在面試中遇到了 關於函式預設引數的坑 的題目,少數夥伴對此問題理得不是太清楚,今天匯智妹請到匯智動力高階教師鄧老師為大家詳細講解一下,幫助不太清楚的小夥伴清晰的梳理一遍。鄧老師本次主要從以下三點來講解 什麼是預設引數?函式預設引數的坑是什麼?函式預設引數為什麼會有坑?一 什麼是預設引數 ...

python預設引數

預設引數很有用,但使用不當,也會掉坑里。預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個list,新增乙個end再返回 def add end l return l當你正常呼叫時,結果似乎不錯 add end 1,2,3 1,2,3,end add end x y z x y z end 當...

Python預設引數

def add end list return list 預設引數多次呼叫,竟然每次結果不一樣 n 0 while n 5 print n,add end n 1 列印結果 很多初學者很疑惑,預設引數是 但是函式似乎每次都 記住了 上次新增了 end 後的list。原因解釋如下 python函式在定...