gpt4 book ai didi

python - 类变量的不可理解的行为

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:27 27 4
gpt4 key购买 nike

<分区>

我不得不说我真的没有问题,因为“一切正常”,但我很难理解为什么。

我正在用 python/urwid 编写脚本。在我的脚本中,我有一个类 ItemWidget,它的 self._w 等于一个 urwid.Pile 的 3 个小部件,每个小部件都是一行 urwid.Text。此外,类 ItemWidget 有一个属性 self.visibility,它是一个包含三个 bool 值的列表,以及一个方法 self.rebuild()。初始化函数是

def __init__ (self, content,vis):
self.content = content
self.visibility = vis
self.rebuild()
self.__super.__init__(self._w)

rebuild() 方法根据 self.visibility() 中的值重建 self._w。

在脚本的 main() 函数中我有一个变量

globalvisibility = [1,1,1]

然后我创建了一个(大约 1000 个)ItemWidget 实例列表:

for content in abstracts:                               # (*)
items.append(ItemWidget(content,globalvisibility)) #

其实我用的是变量而不是

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

只是因为后面我会实现保存全局可见性到一个文件。但我认为除了这个初始化之外,它对任何事情都没有用。

无论如何,在脚本中我经常获取 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 行以指向数据库。要查看行为,请滚动到某些项目并按回车键 - 摘要将仅在这些项目上消失,然后按“显示摘要” - 这将重置所有项目的行为。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com