[英]Python class constructor returns an empty value
我正在基於列表編寫Python類。 構造函數基於作為參數傳遞的其他兩個列表構建一個列表。 邏輯大致是:將列表A復制到新實例,然后遍歷列表B,添加一些條目,並使用其他條目修改列表A中的條目。
我有兩個版本的構造函數。 首先,列表A和列表B是通過循環處理的。 然后我決定變得聰明; 我用一種理解來代替將列表A添加到新實例的循環。
構造函數的第一個版本運行良好。 第二個版本返回一個空列表,即使我可以看看自己在立即調試器的價值構造結束之前, 並認為它是正確的。
為什么會發生這種情況,我該怎么做才能使第二個版本正常工作?
這是使第二個版本行為不當的代碼。 它將列表A復制到新實例,然后遍歷該實例以更新表示列表B中各項的字典中的數據。 getkey是一個從列表元素派生字典鍵的函數(作為參數傳遞); _dictb是一個字典,其中包含列表B中每個元素的元素。
self = [ [bae,None] for bae in ba ] # Copy list A to self
for n in xrange(0,len(self)) : # Iterate over list B
_key = getkey( self[n][0])
if _dictb.has_key(_key) :
_dictb[_key] = n
在第一個有效的版本中,上面的代碼被替換為; 執行的操作和變量的含義相同:
for bae in ba :
_key = getkey(bae)
if _dictb.has_key(_key) :
_dictb[_key] = len(self)
self.append( [bae,None] )
我會假設您在這里實際上是在談論Python構造函數,並且出於某些奇怪的原因,已經省略了類定義和def __init__
語句。 在“第二個版本”(這是您給出的第一個代碼片段)中,第一行將一個列表分配給名為“ self”的局部變量。 那不能用另一個對象代替正在構造的對象。 從構造函數返回的是新對象,而不是變量self。
解決方案:不要分配給自己。 永遠。 甚至不用考慮。
同樣,您不能使用列表推導來創建列表的子類,而只能創建列表的實例。 您的“第一個版本”(第二個代碼段)有效,並且沒有任何問題。
另外:您應將“ _dictb.has_key(key)”替換為“ _dictb中的密鑰”。
如果要對list
進行子類化,則不想在構造函數中重新分配對象self
。 這不會影響列表本身的內部內容,而是將self
的引用替換為您剛剛創建的新列表理解。
換句話說,它不會達到您想要的效果。
而是這樣做:
class MyList(list):
def __init__(self, xs):
super(MyList, self).__init__()
for x in xs: # Assign all values of xs to the list object ``self``
self.append(x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.