本文共 1449 字,大约阅读时间需要 4 分钟。
在Python中,经常需要对一个列表进行复制。关于复制,深拷贝与浅拷贝的区别在于:从原列表复制出的新列表是否会受到原列表的影响,即两个列表在内存中是否共享同一个区域。这一点是区分深拷贝和浅拷贝的关键。
接下来,我们将探讨Python中列表复制的几种方法,并分析它们是浅拷贝还是深拷贝。这对编程来说至关重要,因为理解这一点可以帮助我们避免错误,减少不必要的调试时间。
直接使用=
赋值是非拷贝方法。这两个列表是等价的,修改其中任何一个列表都会直接影响到另一个列表。这体现了Python作为动态语言与C等静态语言在思想上的区别。
示例代码:
old = [1, [1, 2, 3], 3]new = oldprint('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:修改其中一个列表会直接影响到另一个列表。
copy()
方法old = [1, [1, 2, 3], 3]new = old.copy()print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:对于列表第一层实现了深拷贝,但对于嵌套的列表仍然是浅拷贝。
old = [1, [1, 2, 3], 3]new = [i for i in old]print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。
old = [1, [1, 2, 3], 3]new = []for i in range(len(old)): new.append(old[i])print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。
old = [1, [1, 2, 3], 3]new = old[:]print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:同样,只对第一层实现了深拷贝,嵌套的列表仍然是浅拷贝。
如果需要无论多少层都实现深拷贝,可以使用deepcopy()
方法。这种方法非常安全、高效且清爽。
示例代码:
import copyold = [1, [1, 2, 3], 3]new = copy.deepcopy(old)print('Before:')print(old)print(new)new[0] = 3new[1][0] = 3print('After:')print(old)print(new)
运行结果:修改新列表不会影响原列表,且嵌套的列表也实现了深拷贝。
转载地址:http://nkufk.baihongyu.com/