2011-01-17 10 views
1

내 프로그램에 문제가 발생했습니다. 메서드에서 사용되는 모든 것을 메서드에서 사용 된 매개 변수 변수에 저장합니다.메서드는 변수를 원래 매개 변수 변수로 반환합니다.

다음은 예입니다. 목록의 요소를 주어진 공백만큼 왼쪽으로 이동하는 방법입니다.

def moveLeft (perm, pos, spaces): 
    permTemp = perm 
    for n in range(spaces): 
     charMoved = permTemp[pos-n] 
     permTemp [pos-n] = permTemp[pos-n-1] 
     permTemp[pos-n-1] = charMoved 
    return permTemp 

permO = [0,1,2,3] #original perm 
print moveLeft(permO, -1, 2) 
print moveLeft(permO, -1, 2) 
print permO 

(가)의 출력이 될 것으로 예상 : 제 2 개가 동일하게 원래 목록 ([0,1,2으로 마지막 출력 (이 방법의 동일한 리턴 값 인쇄되기 때문에), 삼]). 대신 내가 얻을 :

>>> 
[0, 3, 1, 2] 
[0, 2, 3, 1] 
[0, 2, 3, 1] 

답변

2

사용

permTemp = perm[:] 

실제로 대신 같은 개체에 새 이름을 할당하는 목록을 복사합니다.

파이썬 할당은 새로운 객체를 생성하지 않고 단지 기존 객체의 이름을 지정합니다. 그래서 원래 목록을 수정하고있는 것입니다. 당신이 값을 교환하는 시간 변수를 필요가 없습니다 또한

+0

, 지금은 더 많은 의미가 있습니다! 이것은 이전에이 문제가 발생하지 않았기 때문에 Java에서 일어나는 일과는 달라야합니다! –

+0

아니요, 자바는 똑같은 일을 할 것이고 객체에 대한 참조도 사용하므로'int [] arr = {1,2,3}; int [] arr2 = arr; arr2 [1] = -2;'는 원래 배열을 수정합니다. 실제 사본을 만들 수있는'System.arrayCopy()'메소드가 있습니다. – dimo414

1

사용 스벤의 목록을 복사하지만 참고 :

위대한
def moveLeft(perm, pos, spaces): 
    permTemp = perm[:] 
    for n in range(spaces): 
     permTemp[pos-n], permTemp[pos-n-1] = permTemp[pos-n-1], permTemp[pos-n] 
    return permTemp 
+0

감사합니다. 많은 시간을 절약 할 수 있습니다! –

관련 문제