【发布时间】:2015-06-30 23:37:54
【问题描述】:
我正在编写一个基于列表的 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] )
【问题讨论】:
标签: python list class constructor