可變型別變數 列表 字典等 定為函式預設值時的陷阱

2022-08-23 10:09:09 字數 1571 閱讀 4667

可變型別變數在函式預設值中的一坑,以後大家記得繞著走,話不多說,上**!

可變型別變數列表測試:

def abc(a=):

print

(a)abc()

abc()

[123]

[123]

其實不然,實際情況如下:

[123]

[123, 123]

那換另乙個可變型別變數字典試下呢?

import

random

def abc(a={}):

a[random.randint(1, 5)] = '

123'

print

(a)abc()

abc()

其實不然,實際情況如下:

那麼換成不可變型別變數會是怎樣的呢?那麼拿字串來舉例:

def abc(a=''

): a = a + '1'

print

(a)abc()

abc()

1

11

其實不然,實際情況如下:

1

1

總結:

1、表象:在python中可變型別變數作為預設值賦給函式時,多次呼叫該函式實際只初始化一次,這看起來好像是個bug。

2、本質:在python中對不可變型別(比如字串)進行修改後其實不是對原本的值進行了更改(不可變型別之所以叫不可變型別就是值是固定的,不可修改),而是又開闢了一塊新記憶體來新建立了乙個值,然後再將變數指向這個新值的記憶體位址

def abc(a=):  ===>假設此處空列表位於記憶體0x00001111

print(a)

abc()

abc() ====>第二次呼叫時a的預設值其實還是原來的空列表記憶體處的值,即0x00001111,只不過此時該值增加了乙個「123」

def abc(a=''): ===>假設此處空列表位於記憶體0x00001111

a = a + '1' ===>由於字串為不可變型別,故此處其實是將a指向了另外乙個記憶體空間,假設為0x00002222,而在0x00002222處存放了乙個"1"

print(a)

abc()

abc() ====>第二次呼叫時a的預設值其實還是原來的空字串記憶體處的值,即0x00001111,由於上一次變化是將a指向了另外乙個值,所以此處的值還為空字串

如需要可變型別變數作為預設值時可以採用如下方法:

def abc(a=none):

a =print

(a)abc()

abc()

輸出結果為:

[123]

[123]

列表 字典常用函式

extend iterable 將iterable物件中的元素分別取出追加到列表的最後 lt.extend 鳴人 佐助 櫻 卡卡西 lt.extend lt.extend abcd 注意 extend 函式引數只能接受可迭代物件,123是int值不滿足所以報錯 lt.extend 123 print...

python中列表 字典等常用操作

附 python內建型別 1 list 列表 即動態陣列,c 標準庫的vector,但可含不同型別的元素於乙個list中 a i you he she 元素可為任何型別。下標 按下標讀寫,就當作陣列處理,以0開始,有負下標的使用 0第乙個元素,1最後乙個元素,len第乙個元素,len 1最後乙個元素...

python資料型別(列表 字典)

第一部分 列表 1 什麼是列表?乙個列表需要用中括號 把裡面的各種資料框起來,裡面的每乙個資料叫作 元素 每個元素之間都要用英文逗號隔開。舉例 list 小明 18,1.70 2 從列表中獲取單個元素 列表中每個元素都有自己的位置編號 即偏移量 舉例 從上圖可得 1.偏移量是從0開始的,而非我們習慣...