今天爱分享给大家带来关于list tuple copy 和 deepcopy 的区别是什么?【面试题详解】,希望能够帮助到大家。
tuple:
a = (1, 2, 3, [4, 5, 6, 7], 8) a[3] = 3 //typeerror a[3][3] = 9 // a (1, 2, 3, [4, 5, 6, 9], 8)
列表是可变数据类型,数据的值可以修改的
这里只是修改了元祖子对象的值,而不是修改了元祖的值
修改可变类型的值不会改变内存id,因此元祖的引用还是没有发生变化
可以这么理解,只要不修改元祖中值的内存id,那么就可以进行“修改元祖”操作扩展,
面试官可能会问到:元祖是否可以被修改?
答:元祖是不可变数据类型,因此不能修改元祖中的值,但是如果元组中有可变数据类型,那么可以修改可变数据类型中的值,修改可变数据类型的值并不会使其内存id发生变化,所以元祖中元素中的内存id也没有改变,因此就做到了“修改元祖”操作
list:
a = [1,2,[3,4]] b = a c = a[:] d = a.copy() e = copy.deepcopy(a) id(a), id(b), id(c), id(d), id(e) // 只有a b 是同一个指向 >>> (4398429512, 4398429512, 4398398664, 4398429576, 4398429192) a.append(5) // 只有b跟着改变 a, b, c,d,e ([1, 2, [3, 4], 5], [1, 2, [3, 4], 5], [1, 2, [3, 4]], [1, 2, [3, 4]], [1, 2, [3, 4]]) a[2][1] = 7 // 除了deepcopy, 其他都跟着变了 a, b, c,d,e ([1, 2, [3, 7], 5], [1, 2, [3, 7], 5], [1, 2, [3, 7]], [1, 2, [3, 7]], [1, 2, [3, 4]])
copy 仅拷贝对象本身,而不拷贝对象中引用的其它对象。
deepcopy 除拷贝对象本身,而且拷贝对象中引用的其它对象。(子对象)