分配时列表的Python深层复制

时间:2012-02-24 15:43:43

标签: python list deep-copy metaclass

在python考试中练习了这个练习。 试图返回如下列表的深层副本:

l = list()
l = [0,1,2]
l1 = l
l[0] = 1

l1应包含[0,1,2]而不是[1,1,2]

指定使用元类实现它的练习。

class deep(type):
    def __new__(meta, classname, bases, classDict):
        return type.__new__(meta, classname, bases, classDict)
    def __init__(cls, name, bases, dct):
        super(deep, cls).__init__(name, bases, dct)
    def __call__(cls, *args, **kwds):
        return type.__call__(cls, *args, **kwds)            
class list(metaclass=deep):
    def __init__(self):
        pass

据我所知,python中的'='是一个语句而不是运算符,它不能被覆盖。关于如何在作业中返回深层副本的任何想法?已经尝试了很多但没有成功。

2 个答案:

答案 0 :(得分:1)

据我所知,如果不使用某种额外的语法,这在python中是不可能的。如您所说,您无法覆盖=

答案 1 :(得分:1)

要了解l1 = l在Python中的作用,请阅读Other languages have "variables", Python has "names"

要更改l[0] = 1您可以覆盖l的{​​{1}}方法的内容:

__setitem__()

更改>>> class L(list): ... def __setitem__(self, i, v): ... list.__setitem__(self, i, 10) ... >>> l = L() >>> l.append(1) >>> l [1] >>> l[0] = 0 >>> l [10] 可以在CPython中定义l = List(); l = [0,1,2]方法并操纵名称空间List.__del__()属于例如l模块。不用说你永远不应该这样做。

inspect
相关问题