类变量的不可理解行为

2024-09-29 00:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我不得不说我并没有什么问题,因为“一切都很好”,但我很难理解为什么。你知道吗

我正在用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键-摘要将仅在这些项目上消失,然后按“显示摘要”-这将重置所有项目的行为。你知道吗


Tags: 项目实例方法函数self脚本列表属性
1条回答
网友
1楼 · 发布于 2024-09-29 00:19:59

Why after creating the instances of ItemWidget via (*), changing the variable globalvisibility to, say, [0,1,1] affects all these instances?

因为您在创建所有这些实例时传递了globalvisibility。所有实例都在其vis属性中存储对同一列表的引用。你知道吗

如果要避免这种情况,请在__init__方法中或在创建实例时复制列表:

def __init__ (self, content,vis):
    self.content = content
    self.visibility = vis[:]    # here
    # etc.

或:

for content in abstracts:
    items.append(ItemWidget(content, globalvisibility[:]))  

你在这里做出的确切选择取决于你是否会想要当前的行为。如果是这样,就把它从__init__()中去掉,在创建实例时进行复制。你知道吗

相关问题 更多 >