亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的類成員變量默認初始值的坑及怎么解決

發布時間:2022-02-14 13:07:47 來源:億速云 閱讀:280 作者:iii 欄目:開發技術

這篇文章主要講解了“Python的類成員變量默認初始值的坑及怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python的類成員變量默認初始值的坑及怎么解決”吧!

類成員變量默認初始值的坑

問題發現

一個循環內,缺省值初始化同名變量,其中的list成員不是空,會延續之前同名變量的值。

示例代碼

# 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列表值相同

原因

可選參數默認值的設置在Python中只會被執行一次,也就是定義該函數的時候”如此使用缺省值初始化,list成員指向的是同一個list(地址),如果只是修改其中一個元素(而不是賦值新的list開辟新內存),那么所有instance的list成員都會被修改。

解決方法

直接在構造方法中置為空(self.values = ['', '', '']),之后各個修改值

Python默認值參數

簡單粗暴上代碼

def fun(a, b=[]):
    b += [a]
    print(b)

fun(1)
fun(2,[])
fun(3)

是不是看上去很簡單,其實暗藏玄機,請大家看一下輸出結果,是不是有點讓你疑惑^^~

[1]
[2]
[1, 3]

此時你是否也和我有一樣的疑惑,為什么 fun(3) 的輸出結果是 [1, 3]?

哈哈,不賣關子了,這里是因為,因為函數被定義好后,只會生成一次,所以在函數生成的時候定義的變量 b 的默認值也只會被初始化一次。

因此,當執行fun(1)函數時,沒有給 b 傳參,所以使用的是 b 的默認值,此時 b 的默認值為[1]。

執行fun(2,[])時,給 b 傳了一個[]值(恰好和默認值相同,其實是不同的數據),因此便使用的是傳入數據,執行結果便是[2]。

然后在執行fun(3),此刻又沒有給 b 傳參,所以依舊使用的是 b 的默認值, 而 b 的默認值只會隨著函數的生成被生成一次 ( fun(1) 生成過了 ),所以現在的默認值是fun(1)的執行結果[1],因此當fun(3)再次調用時,輸出結果便會是[1, 3]。

如果不行出現當前這種情況,而是在函數每次被調用的時候都初始化一次變量

可以用下面這種寫法

def function(a, b=None):
    b = b if b else []  # 明確每次重新定義b
    b += [a]
    print(b)

function(1)
function(2, [])
function(3)

輸出結果:

[1]
[2]
[3]

感謝各位的閱讀,以上就是“Python的類成員變量默認初始值的坑及怎么解決”的內容了,經過本文的學習后,相信大家對Python的類成員變量默認初始值的坑及怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涞水县| 双桥区| 湘潭县| 凉山| 容城县| 噶尔县| 普洱| 儋州市| 大庆市| 大化| 甘德县| 上栗县| 沾益县| 无极县| 桂阳县| 镇巴县| 红安县| 肥西县| 三明市| 巫溪县| 丰都县| 汶川县| 江北区| 赤水市| 英德市| 庆元县| 龙岩市| 嫩江县| 沙田区| 沿河| 昌黎县| 兰州市| 阿克| 长治市| 镇雄县| 长乐市| 卓资县| 广安市| 遂川县| 迁西县| 庆阳市|