LeetCode解题中使用Python type()实现列表深拷贝的原理疑问
用
type()拷贝列表的原理拆解 先看你给出的代码:
orignallist=[1,2,3] deepcopylist=type(orignallist)(orignallist)
第一步:type(orignallist)到底干了啥
type()传一个列表进去,返回的是这个列表所属的类——也就是list。说白了,type(orignallist)和直接写list完全是一回事。
第二步:后面的(orignallist)是怎么回事
拿到list这个类之后,加括号调用它,就是在调用列表的构造函数,把原列表当参数传进去。这和你写deepcopylist = list(orignallist)效果一模一样。
你以为的“深拷贝”其实是个误区
你说这是深拷贝,但其实这只是浅拷贝。如果原列表里有可变元素(比如嵌套的子列表),这种方式只会拷贝外层列表,内层的可变对象还是和原列表共享:
orignallist = [1, [2, 3]] copied = type(orignallist)(orignallist) copied[1].append(4) print(orignallist) # 输出 [1, [2, 3, 4]],原列表被改了
只有当列表里全是不可变元素(比如数字、字符串、元组)时,这种拷贝看起来和深拷贝没区别——因为不可变元素根本没法被修改。
为啥文档没提这种用法?
因为这不是type()的特殊功能,而是Python类的通用特性:所有类都能通过括号调用(也就是调用构造函数)来创建新实例。type()只是帮你拿到了原对象的类,剩下的就是常规的实例化操作,所以type()的文档不会专门讲这个——这属于Python面向对象的基础逻辑。
内容的提问来源于stack exchange,提问作者Ely Meyers
相关产品推荐
相关产品推荐

