如何在Python 2.x中使用list子类的.copy()方法?
在Python 2中为自定义list子类添加copy()方法的解决方案
我尝试在自定义的list子类上调用.copy()方法,但Python 2提示该方法不存在。测试代码如下:
class MyList(list): pass mylist = MyList() mylist.append(1) mylist.append("two") print(str(mylist[0]) + " " + mylist[1]) mylist2 = mylist.copy() mylist2.append("C") print(str(mylist2[0]) + " " + mylist2[1] + " " + mylist2[2])
Python 2.6运行结果:
> python foo.py 1 two Traceback (most recent call last): File "foo.py", line 48, in <module> mylist2 = mylist.copy() AttributeError: 'MyList' object has no attribute 'copy'
Python 3.11运行结果:
1 two 1 two C
(注:请勿仅建议升级到Python 3,我们有自身原因。本问题虽与某问题类似,但并非重复,因该问题基于Django场景,而本问题为纯Python场景,且其建议答案不如本问题的接受答案全面。)
问题原因
Python 3.3及以上版本的list类才新增了.copy()浅拷贝方法,而Python 2的list原生并不提供这个方法,因此自定义子类MyList继承自Python 2的list时,自然没有copy()属性。
解决方案
1. 为自定义子类手动实现copy()方法
直接在MyList类中添加copy()方法,通过切片或构造器创建原列表的浅拷贝,并返回MyList类型的实例:
class MyList(list): def copy(self): # 方式1:利用切片创建浅拷贝 return MyList(self[:]) # 方式2:通过list构造器创建拷贝后转成MyList # return MyList(list(self))
修改后调用mylist.copy()即可得到同类型的副本,行为与Python 3中的原生copy()一致。
2. 直接使用Python 2兼容的拷贝方式
如果不想修改类定义,可直接用以下方式替代.copy()调用,这种写法在Python 2和Python 3中都能兼容:
# 切片方式创建MyList副本 mylist2 = MyList(mylist[:]) # 或通过构造器直接传入原列表创建副本 mylist2 = MyList(mylist)
3. 编写兼容Python 2和Python 3的通用代码
如果需要代码同时在两个版本运行,可通过版本判断选择性添加copy()方法:
import sys class MyList(list): # 仅在Python 3.3以下版本添加copy方法 if sys.version_info < (3, 3): def copy(self): return MyList(self[:])
这样Python 2中会使用自定义的copy()方法,Python 3.3+则直接继承原生list的copy()方法,保证跨版本兼容性。
内容的提问来源于stack exchange,提问作者livefree75
相关产品推荐
相关产品推荐

