Python Qt模型项目之间是否存在数据重复?
在Python Qt模型项目之间是否存在数据重复?,python,qt,memory,pyqt,pyside,Python,Qt,Memory,Pyqt,Pyside,在qabstractemmodels中有一种表示数据的标准方法,其中有一个单独的数据项类,用于存储关于项及其在模型中的位置的数据 该示例(在Python中)演示了一种非常标准的方法,其中数据存储在一个TreeItem中,该TreeItem初始化为: class TreeItem(object): def __init__(self, data, parent=None): self.parentItem = parent self.itemData = d
qabstractemmodels
中有一种表示数据的标准方法,其中有一个单独的数据项类,用于存储关于项及其在模型中的位置的数据
该示例(在Python中)演示了一种非常标准的方法,其中数据存储在一个TreeItem
中,该TreeItem初始化为:
class TreeItem(object):
def __init__(self, data, parent=None):
self.parentItem = parent
self.itemData = data
self.childItems = []
请注意,每个TreeItem
实例都包含其相关的特定于项的数据(self.itemData),但也包含其子项列表(即TreeItem
本身)以及其父项(也是TreeItem
)作为属性
为什么这不是一个真正低效的内存使用?让我们关注以下树形图中的项目B:
A
|
|--B
| |--C
| |
| |--D
|
|-E
天真地说,一旦构建完整的数据树,B的数据似乎将被存储四次。它将由A.childItems[0]
,C.parentItem
,D.parentItem
,当然还有B.itemData
返回
是不是有一些Python的魔力使得它不是一种低效的内存使用
注意:即使在子类化QAbstract*Model
时经常使用这些类型的数据容器,但这些容器本身实际上不包含Qt(在TreeItem
的代码中没有子类化Qt类)。所以这实际上是一个基本的Python问题,而不是Qt问题
可能相关的帖子
在Python中,变量名是对对象的引用,因此所有这些不同的表达式实际上都引用同一个对象,即内存中的相同数据。虽然存在引用的重复,但对象没有重复。因此,在您的示例中,
A.childItems[0]
、C.parentItem
和D.parentItem
都是对同一对象的引用,B
。因此A.childItems[0].itemData
,C.parentItem.itemData
,D.parentItem.itemData
都引用相同的B.itemData
对象
与neuronet评论中提到的LEGB文章相关的旁注:如果A、B、C或D中的任何一个修改了itemData
引用的对象(通过调用该对象的方法或设置该对象的属性或数据成员),那么其他所有人都将看到更改。但是,如果将A.childItems[0]
、C.parentItem
或D.parentItem
中的任何一个重新分配给不同的对象,它只会影响父对象:A.childItems[0]=某物
仅影响A.childItems
中的第一个元素C.parentItem
和D.parentItem
,以及对B
的任何其他引用,仍然是指B
你可能会在网上找到有用的答案,但我不觉得它们都那么清楚。我更喜欢,看看你怎么想 在Python中,变量名是对对象的引用,因此所有这些不同的表达式实际上都引用同一个对象,即内存中的相同数据。虽然存在引用的重复,但对象没有重复。因此,在您的示例中,
A.childItems[0]
、C.parentItem
和D.parentItem
都是对同一对象的引用,B
。因此A.childItems[0].itemData
,C.parentItem.itemData
,D.parentItem.itemData
都引用相同的B.itemData
对象
与neuronet评论中提到的LEGB文章相关的旁注:如果A、B、C或D中的任何一个修改了itemData
引用的对象(通过调用该对象的方法或设置该对象的属性或数据成员),那么其他所有人都将看到更改。但是,如果将A.childItems[0]
、C.parentItem
或D.parentItem
中的任何一个重新分配给不同的对象,它只会影响父对象:A.childItems[0]=某物
仅影响A.childItems
中的第一个元素C.parentItem
和D.parentItem
,以及对B
的任何其他引用,仍然是指B
你可能会在网上找到有用的答案,但我不觉得它们都那么清楚。我更喜欢,看看你怎么想 > P> > @ C++和QHANK指出,PyQt和PySead是基于C++的QT的Python包装。因此,如果Qt使用对象/指针(如您所描述的树中的父对象和子对象),那么Python对应的变量也存储引用或指针对象。因此,内存中没有这些对象的复制,只是复制指向内存中相同对象的引用或指针 这些链接是关于这一主题的优秀读物:
< /P> < P> AS @ Sulclii和@汉克指出,PyQt和PySead是基于C++的QT的Python包装。因此,如果Qt使用对象/指针(如您所描述的树中的父对象和子对象),那么Python对应的变量也存储引用或指针对象。因此,内存中没有这些对象的复制,只是复制指向内存中相同对象的引用或指针
这些链接是关于这一主题的优秀读物: < /P>我不知道Python,但是C++中的代码> PARTETEM < /COD>和