首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中复制而不引用

在python中复制而不引用
EN

Stack Overflow用户
提问于 2016-06-12 06:30:41
回答 1查看 26关注 0票数 0

如何复制列表(或任何其他类型)的列表,以便生成的列表是新对象,而不是对旧对象的引用?例如,我有以下列表:

代码语言:javascript
复制
l=[[1,2],[3,4]]

我想要的结果是:

代码语言:javascript
复制
l=[[1,2],[3,4],[1,2],[3,4]]

如果我做了l*=2,新的子列表就是对旧子列表的引用。执行l[0].append("python")将导致

代码语言:javascript
复制
l=[[1,2,'python'],[3,4],[1,2,'python'],[3,4]]

还创建了一个新的列表,如:

代码语言:javascript
复制
l2=list(l)

代码语言:javascript
复制
l2=l[:]

解决不了问题。我想有一个新的子列表,它们独立于它们的起源,并且在变化时对它们的老伙伴没有任何影响。我该怎么做我的蟒蛇?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-12 07:13:14

通常,复制嵌套数据结构以便复制所有引用(而不仅仅是顶层引用)的最佳方法是使用copy.deepcopy。在嵌套列表示例中,可以这样做:

代码语言:javascript
复制
l.extend(copy.deepcopy(l))

即使数据结构包含对自身的引用或对同一对象的多个引用,deepcopy仍然可以工作。它通常也适用于作为自定义类实例中的属性存储的对象。如果您想要给出类特殊的复制行为,可以定义一个__deepcopy__方法(例如,如果它的一些属性是簿记数据,不应该被复制)。

下面是嵌套列表示例代码的一个版本,它使用的是链接列表类的实例,而不是Python的listcopy.deepcopy做了正确的事情!

代码语言:javascript
复制
class linked_list(object):
    def __init__(self, value, next=None):
        self.value = value
        self.next = next

    def __repr__(self):
        if self.next is not None:
            return "({!r})->{!r}".format(self.value, self.next)
        else:
            return "({!r})".format self.value

lst = linked_list(linked_list(1, linked_list(2)),
                  linked_list(linked_list(3, linked_list(4))))
print(lst) # prints ((1)->(2))->((3)->(4))
lst.next.next = copy.deepcopy(lst)
print(lst) # prints ((1)->(2))->((3)->(4))->((1)->(2))->((3)->(4))
lst.value.value = 5
print(lst) # prints ((5)->(2))->((3)->(4))->((1)->(2))->((3)->(4))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37771375

复制
相关文章

相似问题

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