亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

意外的Python類變量

意外的Python類變量

ABOUTYOU 2022-06-28 11:05:09
我在 Python 中遇到過幾次這種行為,這有點令人費解。class MyClass:    def __init__(self, initial_data={}):        self.data = initial_datainstance_a = MyClass()instance_a.data['key1'] = 'val1'print("instance_a.data:", instance_a.data)instance_b = MyClass()print("instance_b.data:", instance_b.data)輸出:instance_a.data: {'key1': 'val1'}instance_b.data: {'key1': 'val1'}我希望data充當一個實例變量,但在這種情況下它看起來像一個類變量。有誰知道為什么會發生這種情況以及避免它的最佳做法是什么?
查看完整描述

2 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

分配時self.data = initial_data,您只需為對象創建另一個新名稱initial_data。


您在這里沒想到的行為是由于默認參數initial_data僅在聲明方法時才被評估一次,而不是每次調用它時,所以所有使用它的實例實際上都使用相同的initial_datadict 對象,您可以以不同的名稱訪問,例如instance_a.data,instance_b.data等等。


經典的解決方案是None默認使用,如下所示:


class MyClass:

    def __init__(self, initial_data=None):

        if initial_data is None:

            initial_data = {}

        self.data = initial_data


查看完整回答
反對 回復 2022-06-28
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

因為數據變量的id是一樣的。Python 中的函數是一流的對象,而不僅僅是一段代碼。


print(id(instance_a.data))

# prints of object id


print(id(instance_b.data))

# prints the same object id

這是因為構造函數的參數中的固定值。它不會為每個對象創建一個新字典。


在這樣做時:


def __init__(self):

    self.data = {}

你會得到不同的結果。


在這里閱讀更多:http: //effbot.org/zone/default-values.htm


希望這有幫助,祝你好運。


查看完整回答
反對 回復 2022-06-28
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號