您好,登錄后才能下訂單哦!
問題發(fā)現(xià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))
結(jié)果:所有實(shí)例的values列表值相同
原因:“可選參數(shù)默認(rèn)值的設(shè)置在Python中只會被執(zhí)行一次,也就是定義該函數(shù)的時(shí)候”如此使用缺省值初始化,list成員指向的是同一個list(地址),如果只是修改其中一個元素(而不是賦值新的list開辟新內(nèi)存),那么所有instance的list成員都會被修改。
解決方法:直接在構(gòu)造方法中置為空(self.values = ['', '', '']
),之后各個修改值
reference:Python 類成員變量使用缺省值初始化時(shí)要注意的一個坑
Python程序員最常犯的十個錯誤
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。