我是Python新手,在使用它編寫小應用程序時,遇到了一個問題。由於我在Google上找不到任何類似的東西,我可能會誤解Python的一些基本概念。如果你們中的某個人能向我解釋這一點,那將是非常棒的。重構用於新對象的構造函數參數?
所以這裏是一個最小的工作示例。請忽略類和變量名稱,這只是一個人爲的例子,但它顯示了我的意思。你可以將它寫入你的IDE併爲你自己運行。
class State(object):
def __init__(self, wrappers = []):
self.wrappers = wrappers
def add(self, name, items):
lst = KeyValList(name)
for item in items:
lst.add(item, items[item])
self.wrappers.append(Wrapper(lst))
class Wrapper(object):
def __init__(self, kv_lst):
self.kv_lst = kv_lst
class KeyValList(object):
def __init__(self, name, kvals = []):
self.name = str(name)
self.kvals = kvals
def add(self, key, value):
self.kvals.append(KeyVal(key, value))
class KeyVal(object):
def __init__(self, key, val):
self.key = str(key)
self.val = val
好的,那就是我使用的類的定義。
右下面我寫了以下內容:
state = State()
kv = { "key1" : "1", "key2" : "2", "key3" : "3" }
state.add("1st", kv)
kv = { "keyX" : "X", "keyY" : "Y", "keyZ" : "Z" }
state.add("2nd", kv)
for wrap in state.wrappers:
print wrap.kv_lst.name, "-->",
for kv in wrap.kv_lst.kvals:
print "%s:%s" % (kv.key, kv.val),
print ""
作爲一個Java程序員,我會想到以下的輸出:
1st --> key3:3 key2:2 key1:1
2nd --> keyZ:Z keyY:Y keyX:X
然而,這一方案在Python我得到以下輸出,而不是:
1st --> key3:3 key2:2 key1:1 keyZ:Z keyY:Y keyX:X
2nd --> key3:3 key2:2 key1:1 keyZ:Z keyY:Y keyX:X
爲什麼兩個列表都包含所有鍵/值對?
我希望這個問題某處KeyValList
類,因爲在調試時state.add()
方法被調用在主程序中的第2次的KeyValList
構造函數的參數kvals
包含前者對。但是,這怎麼可能呢?我不提供任何東西給這個kvals
參數,不應該因爲參數默認值而被初始化爲空列表嗎?
PS:我在Windows上使用Python 2.7.3。
[可變默認參數](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) – katrielalex 2013-04-20 22:19:36