可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument瞭解Python的繼承和初始化
在Python 2.7,考慮我有以下代碼:
class Base(object):
# Variant 1
def __init__(self, records=[]):
self._records = records
# Variant 2
# def __init__(self, records=[]):
# self._records = []
# if records:
# self._records = records
def append(self, value):
self._records.append(value)
class ChildA(Base):
pass
class ChildB(Base):
pass
a = ChildA()
b = ChildB()
a.append(100)
b.append(200)
print a._records
print b._records
如果我使用的變體1初始化我的基類self._records的行爲就像一個類變量。執行使用變體1初始化我的基類中的代碼,我得到的輸出中:
[100, 200]
[100, 200]
使用變種2初始化我的基類,self._records就像一個實例變量(如預期)。執行使用變種2初始化我的基類中的代碼,我得到的輸出:
[100]
[200]
的是這兩種變體之間的區別?爲什麼變體1的工作方式與變體2不同?非常感謝你的幫助!