我正在编写基于列表的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] )
答案 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