You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:14:51