2014-01-10 4 views
2

내가 만든 파이썬 클래스에 약간의 문제가 있습니다. 관련없는 코드를 제거하여 디버깅 할 수있는 가장 간단한 클래스를 만들려고했습니다. 나는 여전히 같은 문제가있다.파이썬 메서드 반환 값

class MyClass(object): 

    def __init__(self): 
     self.row = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 

    def get_row(self): 
     return self.row 

if __name__ == "__main__": 
    a = MyClass() 

    b = a.row 

    b.remove('1') 

    print(a.row) 
    print(b) 

출력은 다음과 같습니다 어떤 일이 일어나고 것은

['2', '3', '4', '5', '6', '7', '8', '9'] 
['2', '3', '4', '5', '6', '7', '8', '9'] 

나는 b.remove을 수행 할 때 ('1'은)는 예상대로 B 목록에서 첫 번째 항목을 제거하지만 내가 볼 때 그것은 또한 그것으로부터 제거되었습니다. 클래스에 대한 나의 이해와 리턴 값은 b가 a의 사본 이었음에 틀림없지 만,이 경우에는 포인터와 같이 행동하는 것처럼 보입니다.

이것이 실제로 어떻게 작동했는지 설명하는 데 도움이 될 것입니다. 파이썬 문서에서

+0

이해가 잘못되었습니다. 모든 값은 파이썬의 객체이며 속성과 이름은이 객체에 대한 참조입니다. 'a.row'는 목록에 대한 참조입니다. 값 자체가 아닌 ** 참고 **를 복사하는 것입니다. –

답변

5

: 파이썬에서

할당 문은 개체를 복사하지 않습니다, 그들은 대상과 대상 사이의 바인딩을 작성합니다. 변경 가능하거나 변경 가능한 항목을 포함하는 콜렉션의 경우, 사본을 변경하지 않고 사본 하나를 변경할 수 있도록 사본이 필요한 경우가 있습니다.

(source)

기본적으로, 당신은 명시 적으로 a.row의 새 복사본을 확인해야합니다. 포인터처럼 행동하는 것이 맞습니다. 이미지와

리스트 구체 예 :

파이썬 변수 단지 이름이 아닌 C에서 C. 같은 변수가없는, 그것은 비트의 집합이고; 변수는 메모리의 어딘가에 존재합니다. 파이썬에서 변수는 객체에 첨부 된 태그 일뿐입니다.

는 다음과 같은 성명을 고려

A = [1, 2, 3]

그것은 목록에 포인트 [1, 2, 3] 우리가 방금 만든하지만이 없다는 것을 의미 명부. 우리가 할 경우

B는

우리는에 의해 참조 목록을 복사하지 않았다 =. 우리는 방금 새 태그 b를 작성하여 a가 가리키는 목록에 연결했습니다. 아래 그림에서처럼 :

http://henry.precheur.org/python/list1.png

[...]

이제 우리는에 의해 참조 목록을 복사 할. 우리는 그것에 b를 붙이기 위해 새로운 목록을 만들어야합니다.

(source)

http://henry.precheur.org/python/list2.png

이후

.행 목록입니다,이 시도 : 당신이 b = a.row을 수행 할 때

마일로 가격으로 말했듯이
b = list(a.row) 
+0

파이썬에서 변경 가능/변경 불가능한 데이터 유형의 차이점은 무엇보다 중요합니다. 멋진 그래픽. – IceArdor

1

는, 나 지금 a.row에 대한 참조를 저장합니다. 그래서 b를 변경하면 a.row도 바뀝니다. 목록을 잘라내보세요. 즉, b = a.row[:]

관련 문제