创建不可变列表副本
在 Python 中,在分配诸如 new_list = my_list 之类的列表引用时,对 new_list 的修改会意外地影响 my_list。发生这种情况是因为 Python 不是创建一个不同的新列表,而是只是复制对实际列表的引用,导致 new_list 和 my_list 都指向同一个列表。
为了解决这个问题并防止意外更改,必须使用各种方法创建列表的真实副本。
克隆列表
获取不可变的克隆或列表的浅表副本,请考虑以下选项:
new_list = old_list.copy()
new_list = old_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中文网其他相关文章!