簡體   English   中英

Python類構造函數返回空值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM