在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中的'='
是一个语句而不是运算符,它不能被覆盖。关于如何在作业中返回深层副本的任何想法?已经尝试了很多但没有成功。
答案 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