【发布时间】:2012-03-15 01:40:30
【问题描述】:
在 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 中的'=' 是一个语句,而不是一个运算符,它不能被覆盖。关于如何在作业中返回深层副本的任何想法?尝试了很多,但没有成功。
【问题讨论】:
-
简而言之,你不能。即使某些巧妙的黑客找到了方法,也不应该永远使用它。相信我,我不会轻易做出这样笼统的陈述。
-
这是一个非常奇怪的练习,因为您可以使用切片符号 (
l1 = l[:]) 执行仅包含三个字符的深层复制。在这里使用元类感觉有点矫枉过正。 -
如果这是学校的考试题,我建议你直接关闭它。要求我们帮助你的考试是学术作弊的高度。
-
@S.Lott:也许考试已经结束了。至少,它应该被标记为
homework或exam。 -
@Frederic Hamidi:也许在您的python版本中,您可以通过这种方式进行深度复制,大多数其他人需要
from copy import deepcopy和b=deepcpy(a)否则只有主列表被复制,而所有嵌套的容器类都是保留在新列表中作为参考!您可以使用例如:for l in (a,b): id(l); map (id,l)进行检查
标签: python list deep-copy metaclass