Python类构造函数返回一个空值

时间:2015-04-23 02:08:41

标签: python list class constructor

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

我有两个版本的构造函数。在第一个中,列表A和列表B由循环处理。然后我决定变得聪明;我使用了解来替换将列表A添加到新实例的循环。

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

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

这是使第二个版本行为异常的代码。它将列表A复制到新实例,然后遍历实例以更新表示列表B中的项的字典中的数据.ba是列表A; 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] )

2 个答案:

答案 0 :(得分:3)

我会假设你在这里真的在谈论Python构造函数,并且由于一些奇怪的原因,它们省略了类定义和$(BUILDDIR)%.js: %.js mkdir -p $(@D) cp $^ $(@D) 语句。在"第二版中,"这是您给出的第一个代码片段,您的第一行将列表分配给名为" self"的局部变量。那不会用不同的对象替换正在构造的对象。从构造函数返回的东西是新对象,而不是变量self。

解决方案:不要分配给自己。永远。不要考虑它。

此外,您无法使用列表推导来创建列表的子类,只能创建列表的实例。你的第一个版本" (第二个代码片段)有效,它没有任何问题。

除此之外:你应该更换" _dictb.has_key(key)"使用"键入_dictb。"

答案 1 :(得分:2)

如果您要对use Cake\ORM\Entity; use Cake\ORM\TableRegistry; // ..snip if ($kablammo instanceOf Entity && !empty($kablammo->source())) { $repository = $kablammo->source(); $table = TableRegistry::get($repository); debug($table->schema()); } 进行细分,则不要在构造函数中重新分配对象list。这不会影响列表本身的内部内容,但会将self的引用替换为您刚创建的新列表理解。

换句话说,它不会产生你想要的效果。

而是做这样的事情:

self