2016-12-05 1 views
1

가이 코드파이썬 목록 대입

이제
class coordenates: 
    x = 0    
    y = 0    

coor = coordenates() 
coor.x=0 
coor.y=0 

list = [] 
list.append(coor) 
list.append(coor) 

에게있어,이 문제는 또한 어떻게 든 list[1].x을 modifing에있다

list[0].x=100 

내가 업데이트 할 때이다!

print str(list[0].x) 
>> 100 
print str(list[1].x) 
>> 100 

0은 업데이트하지 않아야합니다. append()은 0과 1의 위치에서 같은 위치를 가리키는 동일한 객체를 생성합니까? 왜 2 개의 다른 객체를 생성하면 문제가 해결됩니까?

+2

을 두 번 목록에 동일한 개체를 추가합니다. 변경하면 두 색인에서 모두 변경됩니다. –

+0

'append'는 같은 객체를 같은 메모리 위치에 생성하지 않습니다. * 동일한 객체를 명시 적으로 추가하고 있습니다. –

답변

3

현재 코드에서 xy은 클래스 수준 속성입니다. 난 당신이 그들에게 인스턴스 수준의 속성이되고 싶어 용의자. 그렇다면, __init__()에서 그들을 설정 : 두 번 목록에 같은 coor를 추가하는 경우

class Coordinates: 

    def __init__(self): 
     self.x = 0    
     self.y = 0    

이 더 중요한의 coor의 돌연변이가 "모두"좌표에 반영됩니다 (목록 그냥 들고 있기 때문에 목록의 두 위치에서 동일한 기본 좌표 참조). 어쩌면이 대신에 두 개의 독립적 인 좌표 인스턴스를 만드는 것과 같은 것을 원할 것입니다.

list = [] 
list.append(Coordinates()) 
list.append(Coordinates()) 

이 코드를 사용하여 문제의 그림을 볼 수

c = Coordinates() 
cs = [] 
cs.append(c) 
cs.append(c) 

for c in cs: 
    print id(c) # Both elements of the list refer to the same object. 
+0

아마도 가장 좋은 방법입니다. 또한'copy' 모듈을 언급 할 가치가 있습니다. – pbreach

+0

그래서 'temp = 0, list.append (temp), list.append (temp)'list [0] = 100으로하면 두 위치가 모두 수정됩니까? 놀라운 반응을 btw! 나는'list.append (Coordinates())'를 구현하는 방법으로 구현했다. – Joe

+0

@Joe 음 ... 그 예가 조금 다릅니다. 당신은 ** 완전히 새로운 객체 (정수'100')를 ** [0] 요소에 ** 할당하고 있습니다. 초기 예제에서 동일한 객체 ('coor')를리스트에 두 번 추가 한 다음 기본 객체를 변형 시켰습니다. – FMc