首页 > 编程问答 >Python:为列表中的每个类对象创建一个不同的副本

Python:为列表中的每个类对象创建一个不同的副本

时间:2024-07-30 10:30:34浏览次数:10  
标签:python copy python-class variable-initialization

如何制作 Python 类中对象列表的副本,以便每个副本都是所述 Python 类的不同实例?


假设我有一个 Python 类

class myClass():
    def __init__(self, neighbor):
        self.neighbor = neighbor

另外假设 myList = [a,b,c,d,...] 是一个列表 myClass 对象,使得 myList 中的每个条目都有另一个条目 myList 填充其 neighbor 属性。例如,也许

a.neighbor = b
b.neighbor = c
etc.

我想复制 myList 其条目是新 myClass 对象(它们 是不同的对象),但具有直接可比较的 myClass 数据。| ||具体地(天真地)我想要一个返回

的函数 newList = [a0,b0,c0,d0,...] 如果我可以实现下面括号中的操作,我就得到了我想要的。

a0.neighbor = b0
b0.neighbor = c0
etc.

我怎样才能实现括号中描述的过程?

def myFunction(myList):
    myDict = {}
    newList = []
    for item in myList:
        
        (create a myClass object called item0)
        newList = newList.append(item0)
        
        myDict{item} = item0

# populate the neighbor data for each new item
    for item in myList
        myDict{item}.neighbor = myDict{item.neighbor}
        
    return newList

我确信这是一个简单的问题,但我无法确定在 StackOverflow 或文档中搜索的正确关键字是什么。

I'm sure this is a simple question, but I haven't been able to determine what the right keywords to search are on StackOverflow or in the documentation.


可以使用字典来跟踪原始对象和克隆对象,然后更新邻居:

from copy import deepcopy

class MyClass:
    def __init__(self, neighbor=None):
        self.neighbor = neighbor

    def __repr__(self):
        # 用于更清晰的表示形式,返回邻居的id
        return f"MyClass(neighbor={id(self.neighbor)})" 

def copy_list_of_objects(original_list):
    """返回一个包含列表中每个对象的浅表副本的新列表。"""

    # 创建原始对象到克隆对象的映射
    object_map = {}
    cloned_list = []

    # 深度复制对象并将它们存储在映射中
    for obj in original_list:
        cloned_list.append(deepcopy(obj))
        object_map[obj] = cloned_list[-1]  # 使用最后一个添加的对象

    # 更新克隆对象的邻居
    for obj in original_list:
        if obj.neighbor:
            cloned_object = object_map[obj]
            cloned_neighbor = object_map[obj.neighbor]
            cloned_object.neighbor = cloned_neighbor

    return cloned_list

# 示例用法:
a = MyClass()
b = MyClass(a)
c = MyClass(b)
my_list = [a, b, c]

cloned_list = copy_list_of_objects(my_list)

# 验证克隆对象和邻居是否是不同的实例
print(f"Original list: {my_list}")
print(f"Cloned list: {cloned_list}")
for i, (original, cloned) in enumerate(zip(my_list, cloned_list)):
    print(f"Object {i+1}: original={id(original)}, cloned={id(cloned)}")
    print(f"  Original neighbor: {id(original.neighbor) if original.neighbor else None}")
    print(f"  Cloned neighbor: {id(cloned.neighbor) if cloned.neighbor else None}")

说明:

  1. deepcopy 用于创建对象的独立副本,包括其属性的副本。 这确保了克隆对象的修改不会影响原始对象,反之亦然。
  2. object_map 字典 用于跟踪原始对象和相应克隆对象之间的关系。这使得更新克隆对象的 neighbor 属性变得更容易。
  3. 更新 neighbor 属性 的循环中,我们首先检索克隆对象及其邻居,然后相应地更新 neighbor 属性。

此代码首先创建原始对象及其克隆对象的映射,然后遍历克隆对象,更新其 neighbor 属性以指向克隆的邻居。这确保了克隆列表具有与其原始对应物相同的结构,但是所有对象都是独立的实例。

标签:python,copy,python-class,variable-initialization
From: 78809585

相关文章

  • 需要使用Python代码将一个文件的一部分复制到另一个文件的相同但空的部分
    例如:需要将文件A中第1部分的x、y和z行复制到文件B中括号之间的第1部分。需要帮助,如果给定多个文件,文件A部分1中的行数将是更改,因此总是需要在括号之间复制到括号之间。文件A:Section1{xyz}Section2{abc}文件B:Section1{}S......
  • Open3D点云裁剪-用Python实现高效的点云处理技术
    点云数据是计算机视觉领域中常用的一种数据表示形式,它以三维空间中的离散点集合的方式来描述物体的形状和结构,在点云数据处理过程中,点云裁剪是一项关键任务,它可以帮助我们从原始的点云数据中提取出感兴趣的物体或区域,从而提高数据处理效率和准确性,本文将介绍如何使用Open3D库和......
  • Python,计算HSV图像的直方图,忽略背景
    我正在尝试使用openCV计算HSV图像的直方图,使用以下代码:defistogrammaHSV(image,histSize):hsv_planes=cv2.split(image)histSize=histSizehistRange=(0,256)accumulate=Falseh_hist=np.array(cv2.calcHist(hsv_planes,[0],None,[......
  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......