Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Qt模型项目之间是否存在数据重复?_Python_Qt_Memory_Pyqt_Pyside - Fatal编程技术网

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>和子项 >将指向相关的项。它们不包含任何用户数据,所以没有任何“数据复制”。我不知道Python,但是在C++ >代码> PARTETEM < /代码>和<代码>子项< /代码>将指向相关项。它们不包含任何用户数据,因此不存在任何“数据复制”。您所说的很直观,但我记得读过类似“任何使用术语变量、引用或按值调用的人都很可能以错误的方式解释Python”()之类的内容,然后我又开始感到困惑。是否有标准资源可供参考,以了解这方面的细节?例如,以下是好的吗@neuronet给出了Python文档