您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python的類成員變量默認(rèn)初始值的坑及怎么解決”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python的類成員變量默認(rèn)初始值的坑及怎么解決”吧!
一個循環(huán)內(nèi),缺省值初始化同名變量,其中的list成員不是空,會延續(xù)之前同名變量的值。
# Define class class Variant(): # use def __init__(self, price = 500, description = 'default description', values = ['', '', '']): self.price = price self.description = description self.values = values def __str__(self): return 'price: {}, description: {}, values: {}'.format(self.price, self.description, self.values) variant_list = [] # Create instance with same name iteratively for i in range(3): current_variant = Variant() if i == 1: current_variant.values[2] = 'hello' current_variant.price = i current_variant.description = 'description of variant: {}'.format(i) variant_list.append(current_variant) # Test results for variant in variant_list: print(str(variant))
所有實例的values列表值相同
可選參數(shù)默認(rèn)值的設(shè)置在Python中只會被執(zhí)行一次,也就是定義該函數(shù)的時候”如此使用缺省值初始化,list成員指向的是同一個list(地址),如果只是修改其中一個元素(而不是賦值新的list開辟新內(nèi)存),那么所有instance的list成員都會被修改。
直接在構(gòu)造方法中置為空(self.values = ['', '', '']),之后各個修改值
def fun(a, b=[]): b += [a] print(b) fun(1) fun(2,[]) fun(3)
是不是看上去很簡單,其實暗藏玄機(jī),請大家看一下輸出結(jié)果,是不是有點讓你疑惑^^~
[1]
[2]
[1, 3]
此時你是否也和我有一樣的疑惑,為什么 fun(3) 的輸出結(jié)果是 [1, 3]?
哈哈,不賣關(guān)子了,這里是因為,因為函數(shù)被定義好后,只會生成一次,所以在函數(shù)生成的時候定義的變量 b 的默認(rèn)值也只會被初始化一次。
因此,當(dāng)執(zhí)行fun(1)函數(shù)時,沒有給 b 傳參,所以使用的是 b 的默認(rèn)值,此時 b 的默認(rèn)值為[1]。
執(zhí)行fun(2,[])時,給 b 傳了一個[]值(恰好和默認(rèn)值相同,其實是不同的數(shù)據(jù)),因此便使用的是傳入數(shù)據(jù),執(zhí)行結(jié)果便是[2]。
然后在執(zhí)行fun(3),此刻又沒有給 b 傳參,所以依舊使用的是 b 的默認(rèn)值, 而 b 的默認(rèn)值只會隨著函數(shù)的生成被生成一次 ( fun(1) 生成過了 ),所以現(xiàn)在的默認(rèn)值是fun(1)的執(zhí)行結(jié)果[1],因此當(dāng)fun(3)再次調(diào)用時,輸出結(jié)果便會是[1, 3]。
如果不行出現(xiàn)當(dāng)前這種情況,而是在函數(shù)每次被調(diào)用的時候都初始化一次變量
def function(a, b=None): b = b if b else [] # 明確每次重新定義b b += [a] print(b) function(1) function(2, []) function(3)
輸出結(jié)果:
[1]
[2]
[3]
感謝各位的閱讀,以上就是“Python的類成員變量默認(rèn)初始值的坑及怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python的類成員變量默認(rèn)初始值的坑及怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。