首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浅拷贝对象列表

浅拷贝对象列表
EN

Stack Overflow用户
提问于 2017-06-28 20:17:26
回答 2查看 191关注 0票数 0

将对象的引用从一个列表转移到另一个列表(将对象从一个列表移动到另一个列表)的最佳方法是什么。为了清晰起见,我需要在复制后从d[1]中删除对象

代码语言:javascript
复制
class MyObject:
    def __init__(self,v):
        self.value = v

d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []}

#which one?
#d[2] = [obj for obj in d[1]]

#d[2] = d[1][:]

#d[2] = d[1].copy()

#clear d[1]
#d[1] = []

for i in range(len(d[1])):
    d[2].append(d[1].pop(0))

for o in d[2]:
    print (o.value)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-28 20:24:55

哪种方法最好,这在一定程度上取决于周围代码的细节。是否有任何其他变量或数据结构包含对任何列表的引用?如果没有,您可以重新绑定dict中的引用(这需要O(1)时间,因为没有复制):

代码语言:javascript
复制
d = {1: [MyObject("obj1"),MyObject("obj2")], 2: []}
d[2] = d[1]
d[1] = []

如果对现有列表的其他引用可能存在,并且希望它们继续引用正确的值(例如,在更改之后,对d[1]的旧引用仍然应该引用d[1] ),那么您希望执行一个片赋值,然后是一个清除(这是O(N)):

代码语言:javascript
复制
d[2][:] = d[1] # copy data
d[1].clear()

我不认为有充分的理由使用任何其他方法,除非您有其他的逻辑可应用(例如,如果您只想复制一些值,而不是其他的)。

票数 3
EN

Stack Overflow用户

发布于 2017-06-28 20:23:35

添加字典会模糊用例。根据您的示例,不清楚您想要对象的副本还是引用相同对象的列表。

假设是后者,则考虑简化的情况。它实际上就像将列表赋值给另一个变量一样简单:

代码语言:javascript
复制
>>> class MyObject(object):
...     def __init__(self, v):
...         self.value = v
...
>>> x = [MyObject(1), MyObject(2)]
>>> y = x
>>> x[1].value
2

现在,xy都是同一个引用对象的列表。如果我在一个列表中更改对象,它将在另一个列表中更改:

代码语言:javascript
复制
>>> y[1].value = 3
>>> x[1].value
3

在您的用例中(包含列表值的字典),这非常简单:

代码语言:javascript
复制
d[2] = d[1]

如果有必要,可以删除1键:

代码语言:javascript
复制
del d[1]

瞧!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44811823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档