我不得不说我并没有什么问题,因为“一切都很好”,但我很难理解为什么。你知道吗
我正在用python/urwid编写一个脚本。在我的脚本中有一个类ItemWidget,它的self.\u w等于urwid.桩包含3个小部件,每个小部件都是一行urwid.文本. 此外,类ItemWidget有一个属性自可见性,这是三个布尔值的列表,以及一个方法自我重建(). init函数是
def __init__ (self, content,vis):
self.content = content
self.visibility = vis
self.rebuild()
self.__super.__init__(self._w)
方法rebuild()根据中的值重建self.\u w自可见性(). 你知道吗
在脚本的main()函数中,我有一个变量
globalvisibility = [1,1,1]
我创建了一个ItemWidget实例列表(大约1000个):
for content in abstracts: # (*)
items.append(ItemWidget(content,globalvisibility)) #
事实上我用了一个变量而不是
for content in abstracts.items():
items.append(ItemWidget(content,[1,1,1]))
只是因为稍后我将实现将globalvisibility保存到文件。但我认为除了初始化之外,它对任何事情都没有用处。你知道吗
无论如何,在脚本中,我经常以ItemWidget的一个实例为例,通过
item.visibility[2] = 0 # (**)
类似的。到目前为止,一切正常,正如预期的那样。你知道吗
这是我的问题。为什么在通过(*)创建ItemWidget实例之后,将变量globalvisibility更改为[0,1,1]会影响所有这些实例?你知道吗
我不得不说,我是无意中“发现”了它,而且它看起来非常有用(我认为要更改ItemWidget所有实例的可见性属性,我必须遍历所有实例),但是——对我来说——非常令人惊讶。特别是考虑到操作(**)只影响单个实例。你知道吗
我非常感谢你的解释。你知道吗
编辑:整个脚本如下: https://www.dropbox.com/s/a0a4a0asyi5lyxw/tescik.py?dl=0 以及示例数据库,如果itemwidget是: https://www.dropbox.com/s/zuwbvggznst85ru/arxiv-2013-05-23.db?dl=0
为了运行它,您需要修改第58行以指向数据库。要查看行为,请滚动到某些项目并按enter键-摘要将仅在这些项目上消失,然后按“显示摘要”-这将重置所有项目的行为。你知道吗
因为您在创建所有这些实例时传递了
globalvisibility
。所有实例都在其vis
属性中存储对同一列表的引用。你知道吗如果要避免这种情况,请在
__init__
方法中或在创建实例时复制列表:或:
你在这里做出的确切选择取决于你是否会想要当前的行为。如果是这样,就把它从
__init__()
中去掉,在创建实例时进行复制。你知道吗相关问题 更多 >
编程相关推荐