2009-09-09 4 views
3

필자는이 복사 방법을 꽤 많이 필요로하는 많은 수업에서 사용 해왔다.Python : copy.deepcopy가 오류를 발생합니다.

class population (list): 
def __init__ (self): 
    pass 

def copy(self): 
    return copy.deepcopy(self) 

은 갑자기이 오류 생산 시작 : 라인 338, 162, 255에 대한 참조를 포함

 File "C:\Python26\lib\copy.py", line 338, in _reconstruct 
    state = deepcopy(state, memo) 
    File "C:\Python26\lib\copy.py", line 162, in deepcopy 
    y = copier(x, memo) 
    File "C:\Python26\lib\copy.py", line 255, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
    File "C:\Python26\lib\copy.py", line 189, in deepcopy 
    y = _reconstruct(x, rv, 1, memo) 
    File "C:\Python26\lib\copy.py", line 323, in _reconstruct 
    y = callable(*args) 
    File "C:\Python26\lib\copy_reg.py", line 93, in __newobj__ 
    return cls.__new__(cls, *args) 
TypeError: object.__new__(generator) is not safe, use generator.__new__() 
>>> 

라인을, 189는 '선 338'전에 적지 회 반복되었는지 나는 여기에서 베꼈다.

답변

9

발전기를 복제하고 있습니까? 여기 가브리엘 Genellina에 의해 Generators can't be cloned.

복사 답 :

"복제"발전기의 방법이 없습니다

:

py> g = (i for i in [1,2,3]) 
py> type(g)() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: cannot create 'generator' instances 
py> g.gi_code = code 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: readonly attribute 
py> import copy 
py> copy.copy(g) 
Traceback (most recent call last): 
... 
TypeError: object.__new__(generator) is not safe, use generator.__new__() 
py> type(g).__new__ 
<built-in method __new__ of type object at 0x1E1CA560> 

당신은 발전기 기능으로는 역할을하기 때문에 그렇게 할 수는 "발전기
공장", 호출시 새 발전기를 구축합니다. 내가 :(

py> import ctypes 
py> PyGen_New = ctypes.pythonapi.PyGen_New 
py> PyGen_New.argtypes = [ctypes.py_object] 
py> PyGen_New.restype = ctypes.py_object 
py> g = (i for i in [1,2,3]) 
py> g2 = PyGen_New(g.gi_frame) 
py> g2.gi_code is g.gi_code 
True 
py> g2.gi_frame is g.gi_frame 
True 
py> g.next() 
1 
py> g2.next() 
2 

알고 "즉시"프레임의 객체를 생성하는 방법
을하고있다 - 심지어 하나의 프레임 객체를 필요로 발전기를 만들려면 파이썬 C
API를 사용하지 g 및 G2 주 동일한 실행 프레임, 그래서 그들은 독립하지 않은 파이썬에서 새로운 프레임을 만들 수있는 쉬운 방법은 없습니다
:

py> type(g.gi_frame)() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: cannot create 'frame' instances 

한 PyFrame_New를 사용하여 시도해 볼 수도 있습니다 -하지만 그건 너무 마법입니다. 내 취향에 ...

+0

저는이 부분에서 새로운데, 방금 '수익률'을 사용하려했습니다. 그래서 나는 그 (것)들에 더 많은 것을 잘 읽어야한다. 예, 'yield'를 제거하면 오류가 사라집니다. 감사합니다 –

+0

링크가 작동하지 않는 것 같습니다. – antonagestam

+0

@antonagestam 수정되었습니다. – wRAR

0

이것은 많은 경우 실수로 반복기를 클래스에 복제하려고 시도 할 때 발생합니다. 예를 들어 PIL에서 PixelAccess (Image)을 복제하려고하면이 오류가 발생합니다.

예를 들면 pixels = image.load()입니다. pixels_copy = copy.copy(pixels)과 같은 것을 시도하는 대신 기본 객체를 복사 한 다음 반복기를 생성해야합니다. 따라서 해당 코드를 pixels_copy = image.copy().load()으로 대체하십시오.

관련 문제