Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python copy.deepcopy使用自定义的新方法()在对象上引发TypeError_Python_Deep Copy - Fatal编程技术网

Python copy.deepcopy使用自定义的新方法()在对象上引发TypeError

Python copy.deepcopy使用自定义的新方法()在对象上引发TypeError,python,deep-copy,Python,Deep Copy,我想实现一种符号类型,它跟踪我们已经拥有的符号(保存在\u sym\u table中),如果它们存在,就返回它们,否则就创建新的符号。守则: # -*- coding: utf-8 -*- _sym_table = {} class Symbol(object): def __new__(cls, sym): if sym not in _sym_table: return super().__new__(cls) else:

我想实现一种符号类型,它跟踪我们已经拥有的符号(保存在
\u sym\u table
中),如果它们存在,就返回它们,否则就创建新的符号。守则:

# -*- coding: utf-8 -*-

_sym_table = {}

class Symbol(object):
    def __new__(cls, sym):
        if sym not in _sym_table:
            return super().__new__(cls)
        else:
            return _sym_table[sym]

    def __init__(self, sym):
        self.sym = sym
        _sym_table[sym] = self

    def __str__(self):
        return self.sym

    def __cmp__(self, other):
        return self is other

    def __hash__(self):
        return self.sym.__hash__()
但当我在此类
Symbol
实例列表上调用
copy.deepcopy
时,会引发异常:

a = Symbol('a')
b = Symbol('b')
s = [a, b]
t = copy.deepcopy(s)
错误消息:

Traceback (most recent call last):
  File "xxx.py", line 7, in <module>
    t = copy.deepcopy(s)
  File "/usr/lib/python3.2/copy.py", line 147, in deepcopy
    y = copier(x, memo)
  File "/usr/lib/python3.2/copy.py", line 209, in _deepcopy_list
    y.append(deepcopy(a, memo))
  File "/usr/lib/python3.2/copy.py", line 174, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/usr/lib/python3.2/copy.py", line 285, in _reconstruct
    y = callable(*args)
  File "/usr/lib/python3.2/copyreg.py", line 88, in __newobj__
    return cls.__new__(cls, *args)
TypeError: __new__() takes exactly 2 arguments (1 given)
回溯(最近一次呼叫最后一次):
文件“xxx.py”,第7行,在
t=复制。深度复制(s)
文件“/usr/lib/python3.2/copy.py”,第147行,在deepcopy中
y=复印机(x,备忘)
文件“/usr/lib/python3.2/copy.py”,第209行,在深度复制列表中
y、 附加(副本(a、备忘录))
文件“/usr/lib/python3.2/copy.py”,第174行,在deepcopy中
y=_(x,rv,1,备忘录)
文件“/usr/lib/python3.2/copy.py”,第285行,在
y=可调用(*args)
文件“/usr/lib/python3.2/copyreg.py”,第88行,在__
返回cls.\uuuu新建\uuuuu(cls,*args)
TypeError:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
因此,我的问题是:

  • 如何使用自定义的
    \uuuu new\uuu
    方法在这些对象上进行深度复制
  • 以及关于何时以及如何使用
    copy.deepcopy
    的任何建议

非常感谢

在我看来,您希望符号实例为单例。但是,当您需要一个实例的精确副本,即与原始实例相同的另一个实例时,应该使用Deepcopy


所以这里的用法有点违背了deepcopy的目的。如果您想让它以任何方式工作,您可以在Symbol上定义方法

一个问题是
deepcopy
copy
无法知道要传递给
\uuuuuu new\uuuuu
的参数,因此它们只适用于不需要构造函数参数的类

您可以使用
\uuuuuuuuuuuuuuuuuuu
参数的原因是,复制对象时不会调用
\uuuuuuuuuuuuuuu
,但必须调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新建
才能创建新对象

因此,如果您想要控制复制,您必须定义特殊的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuu
方法:

def __copy__(self):
    return self

def __deepcopy__(self, memo):
    return self

顺便说一句,在python中,是而且不是真正需要的。

定义
\uuu getnewargs\uuu
-这样,您不仅能够
复制
深度复制
,而且还能够
pickle