我正在基于列表编写Python类。构造函数基于作为参数传递的其他两个列表构建一个列表。逻辑大致是:将列表A复制到新实例,然后遍历列表B,添加一些条目,并使用其他条目修改列表A中的条目。

我有两个版本的构造函数。首先,列表A和列表B是通过循环处理的。然后我决定变得聪明;我用一种理解来代替将列表A添加到新实例的循环。

构造函数的第一个版本运行良好。第二个版本返回一个空列表,即使我可以在构造函数结束之前立即在调试器中查看self的值,并确认它是正确的。

为什么会发生这种情况,我该怎么做才能使第二个版本正常工作?

这是使第二个版本行为不当的代码。它将列表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大神给出的解决方案

我会假设您在这里真的是在谈论Python构造函数,并且由于某些奇怪的原因而省略了类定义和def __init__语句。在“第二个版本”(这是您给出的第一个代码片段)中,第一行将一个列表分配给名为“ self”的局部变量。那不能用另一个对象代替正在构造的对象。从构造函数返回的是新对象,而不是变量self。

解决方案:不要分配给自己。曾经甚至不用考虑。

同样,您不能使用列表推导来创建列表的子类,而只能创建列表的实例。您的“第一个版本”(第二个代码段)有效,并且没有任何问题。

另外:您应将“ _dictb.has_key(key)”替换为“ _dictb中的密钥”。