首页 >后端开发 >Python教程 >如何在 Python 中创建列表的不可变副本?

如何在 Python 中创建列表的不可变副本?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-24 03:37:14767浏览

How Can I Create an Immutable Copy of a List in Python?

创建不可变列表副本

在 Python 中,在分配诸如 new_list = my_list 之类的列表引用时,对 new_list 的修改会意外地影响 my_list。发生这种情况是因为 Python 不是创建一个不同的新列表,而是只是复制对实际列表的引用,导致 new_list 和 my_list 都指向同一个列表。

为了解决这个问题并防止意外更改,必须使用各种方法创建列表的真实副本。

克隆列表

获取不可变的克隆或列表的浅表副本,请考虑以下选项:

  • list.copy() 方法 (Python 3.3 ):
new_list = old_list.copy()
  • 列表切片:
new_list = old_list[:]
  • list() 构造函数:
new_list = list(old_list)

深度复制列表

如果需要复制列表的元素也使用深度复制:

import copy
new_list = copy.deepcopy(old_list)

示例

考虑以下代码:

import copy

class Foo:
    def __init__(self, val):
         self.val = val

    def __repr__(self):
        return f'Foo({self.val!r})'

foo = Foo(1)

a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)

# edit orignal list and instance 
a.append('baz')
foo.val = 5

print(f'original: {a}\nlist.copy(): {b}\nslice: {c}\nlist(): {d}\ncopy: {e}\ndeepcopy: {f}')

结果:

original: ['foo', Foo(5), 'baz']
list.copy(): ['foo', Foo(5)]
slice: ['foo', Foo(5)]
list(): ['foo', Foo(5)]
copy: ['foo', Foo(5)]
deepcopy: ['foo', Foo(1)]

这演示了如何对原始列表及其实例的修改仅影响原始列表,而不影响其复制版本(b、c、d 和 f)。

以上是如何在 Python 中创建列表的不可变副本?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn