克隆列表:在 Python 中保持完整性
在 Python 中,将新变量分配给现有列表会创建浅表副本,使您容易受到影响意外的列表修改。让我们阐明为什么会发生这种行为,并探索有效的克隆方法来确保列表不变性。
为什么赋值不会导致克隆:
当您执行 new_list = 时my_list,您将指向同一列表对象的指针分配给 new_list。这两个变量都引用原始列表,使任何后续修改都在 new_list 和 my_list 中可见。
有效复制列表:
要创建真正的克隆,您需要几种方法:
1.使用 list.copy():
此方法在 Python 3.3 中引入,可创建列表的不同副本。
**2.使用 [:] 对列表进行切片:**
此语法会创建一个与原始列表具有相同元素的新列表。
3.使用列表构造函数 (list()):
这会从现有的可迭代对象创建一个新列表,例如另一个列表。
4.使用copy.copy():
这个内置函数提供了基本的浅拷贝,足以满足大多数用例。
5.使用 copy.deepcopy():
这种更全面的方法创建深度复制,其中嵌套对象也被克隆。
示例:
让我们比较一下这些结果方法:
import copy my_list = ['foo', 'bar'] new_list = my_list.copy() sliced_list = my_list[:] list_constructor_list = list(my_list) shallow_copy_list = copy.copy(my_list) deep_copy_list = copy.deepcopy(my_list) my_list.append('baz') print(f'Original list: {my_list}') print(f'Copied list: {new_list}') print(f'Sliced list: {sliced_list}') print(f'List constructed from iterator: {list_constructor_list}') print(f'Shallow copy: {shallow_copy_list}') print(f'Deep copy: {deep_copy_list}')
输出:
Original list: ['foo', 'bar', 'baz'] Copied list: ['foo', 'bar'] Sliced list: ['foo', 'bar'] List constructed from iterator: ['foo', 'bar'] Shallow copy: ['foo', 'bar'] Deep copy: ['foo', 'bar']
从输出中可以明显看出,my_list 在附加 'baz' 后发生了更改,而克隆的列表保持不变。
以上是如何在 Python 中正确克隆列表并避免意外修改?的详细内容。更多信息请关注PHP中文网其他相关文章!