可變類型變量在函數預設值中的一坑,以後大家記得繞着走,話不多說,上代碼!
可變類型變量清單測試:
def abc(a=[]):
a.append(123)
print(a)
abc()
abc()
此時大家可能覺得應該輸出如下内容:
[123]
[123]
其實不然,實際情況如下:
[123]
[123, 123]
那換另一個可變類型變量字典試下呢?
import random
def abc(a={}):
a[random.randint(1, 5)] = '123'
print(a)
abc()
abc()
此時大家可能覺得應該輸出如下内容:
{随機值: '123'}
{随機值: '123'}
其實不然,實際情況如下:
{2: '123'}
{2: '123', 3: '123'}
那麼換成不可變類型變量會是怎樣的呢?那麼拿字元串來舉例:
def abc(a=''):
a = a + '1'
print(a)
abc()
abc()
按照上面的慣性大家可能會以為輸出結果為下面這樣:
1
11
其實不然,實際情況如下:
1
1
總結:
1、表象:在python中可變類型變量作為預設值賦給函數時,多次調用該函數實際隻初始化一次,這看起來好像是個bug。
2、本質:在python中對不可變類型(比如字元串)進行修改後其實不是對原本的值進行了更改(不可變類型之是以叫不可變類型就是值是固定的,不可修改),而是又開辟了一塊新記憶體來新建立了一個值,然後再将變量指向這個新值的記憶體位址
def abc(a=[]): ===>假設此處空清單位于記憶體0x00001111
a.append(123) ===>将記憶體0x00001111的值增加了一個“123”
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 = []
a.append(123)
print(a)
abc()
abc()
輸出結果為:
[123]
[123]