2013-03-16 2 views
1

이 문제는 state 변수 (args)에서 발생합니다. 내 코드에서 수정되었습니다 (new_state 수정 이후). 그러나, 나는 list()을 사용하여 이런 종류의 문제를 막을 수 있다고 읽었습니다 (statenew_state은 같은 참조 번호를가집니다).Python에서 참조 오류가 발생했습니다.

요약하면, 함수의 시작 부분과 반환 바로 앞의 state 값을 표시하면 값이 달라집니다. (분명히이 변수의 값을 변경하고 싶지 않습니다!). 이 문제를 어떻게 해결할 수 있습니까?

def successor(self, state, numberClients, numberDepots, Q, dist_table):   
    succ_list = list() 
    for i in range(0, len(state)): 
     for j in range(0, len(state[i])): 
      switchIndex = 0 
      while switchIndex < length: 
       permutationIndex = 0 
       while permutationIndex < len(state[switchIndex]):      
        new_state = list(state) 
        temp = new_state[switchIndex][permutationIndex] 
        new_state[switchIndex][permutationIndex] = new_state[i][j] 
        new_state[i][j] = temp 
        if checkConst(new_state): # accept only in some cases (we don't care here) 
         succ_list.append(('act', new_state))    
        permutationIndex += 1 
      switchIndex += 1 
    return succ_list 

답변

2

목록의 목록은 state입니다.

new_state = list(state)을 수행하면 외부 목록이 복사되지만 복사본 안의 참조는 여전히 같은 내부 목록을 가리 킵니다. 당신은 스스로 해결책을 발견

new_state = [list(e) for e in state] 
0

:

이보십시오. 통화의 참조 번호 : list(...)이 새 목록에 복사됩니다. 그래서 본질적으로 그것은 딥 카피가 아니라 얕은 카피입니다. 다음 코드는 그것을 설명합니다. 다음 코드 대신 new_state = list(state)new_state = copy.deepcopy(state)를 사용

import copy 

그리고 - :

>>> class A: pass 
... 
>>> a=map(lambda x:A(), range(5)) 
>>> a 
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>] 
>>> b=list(a) 
>>> b 
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>] 
>>> b[0].v=23 
>>> a 
[<__main__.A instance at 0x1018d11b8>, <__main__.A instance at 0x1018f17a0>, <__main__.A instance at 0x101868950>, <__main__.A instance at 0x1018687a0>, <__main__.A instance at 0x101868830>] 
>>> a[0] 
<__main__.A instance at 0x1018d11b8> 
>>> a[0].v 
23 

또한, 문제를 방지하기 위해, 당신은 사용할 수 있습니다.

다음 코드는이 설명 : -

>>> import copy 
>>> copy.deepcopy 
<function deepcopy at 0x1004d71b8> 


>>> a=map(lambda x:A(), range(5)) 
>>> b=copy.deepcopy(a) 
>>> b[0].v=23 
>>> a[0].v 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'v' 
+0

확인 deepcopy 트릭, 고마워 할 것입니다! 예 목록 목록입니다. – Scipion

+0

차가움. 답변을 수락하고 계속 진행하십시오. – GodMan

관련 문제