2017-12-21 1 views
0

이 질문은 매우 구체적인 질문은 아니지만 몇 가지 예를 들려 줄 수 있습니다. 변수가 새로운 객체를 가리키는 시점을 알지 못하거나 두 객체가 동일한 객체를 가리키는 경우를 알지 못하기 때문에 Python을 매우 두려워합니다.같은 객체에 변수를 할당하는 것과는 반대로 Python에서 새로운 객체를 생성하는 방법을 알고 자 할 때

예를 들어 I는 다음과 같이 할당 무서워 : 나는 self.value을 변경하면 번호를 변경하지 않으이 경우

def function(self): 
    number = self.value 
    return number 

.

또한 단지 복사 목록 좋아 : 나는 목록을 변경하는 경우이 경우

list = [1,2,3] 
list2 = list 

는,리스트 2는 바람직하지 않은 변경됩니다. 왜 내가 새로운 변수가되고 싶지 않으면 그것을 복사 할까?

어쨌든이 경우 새 변수를 만드는 안전한 방법을 아는 사람이 있는지 궁금한 점이 있거나 새로운 개체가 만들어 질 때와 두 변수가 같은 개체를 가리키는 경우에 대한 완전한 설명이 포함되어 있는지 궁금합니다. 나는 코드가 크고 앉아서 어떤 변수가 변경되었는지 그리고 모든 계산 후에 어떤 변수가 없는지를 확인할 수 없기 때문에 항상 코드를 작성하고 걱정하지 않으려 고합니다.

질문은 질문에 대한 링크 있도록 가변성과 불변성 관련이있다 : Immutable vs Mutable types, 좋을 수도 있지만, 이것은 일부 도움이 될 수있는 질문의 또 다른 방법입니다. 또한 이것은 돌연변이를 피하는 데 더 중점을 둡니다.

+2

단순 규칙 : 할당 ** 절대로 ** 새 개체를 만듭니다. 할당 후에 항상 왼쪽의 이름은 오른쪽의 객체를 참조하기 만합니다. –

+0

그래서 항상 새로운 변수 A에 값을 할당해야합니다. 그런 다음 변수 B의 값을 A에 할당 할 수 있습니다. 그러면 객체의 복사본이 항상 생성됩니까? –

+0

[Immutable vs Mutable types] 가능한 복제본 (https://stackoverflow.com/questions/8056130/immutable-vs-mutable-types) – jwodder

답변

1

많은 언어에서와 마찬가지로 일부 개체는 변경 가능하고 일부 개체는 불변이라고합니다. 불변의 오브젝트 란, 한 번 작성한 오브젝트가 변경 불가능한 오브젝트입니다 (int 등).

x = 3 
y = x 
같은 객체를 이전 예의

모두 xy포인트하지만 3는 불변이기 때문에 문제가되지 않는다.

list과 같이 다른 일부 개체는 변경할 수 있습니다. 그것은 그들의 가치를 변화시킬 수있는 방법이 있음을 의미합니다. 여기

l1 = [1, 2, 3] 
l2 = l1 # This does not copy the object, it simply makes the name l2 point to it 

int가 발생하는 경우와 동일한는 두 변수가 같은 객체를 가리하지만, 그 객체를 변경하는 방법이 존재한다. 예를 들어 l2.append(4)을 수행하여

여기서 말하는 내용을 피하는 가장 좋은 방법은 우수 사례를 채택하는 것입니다. 예를 들어, 함수를 순수하게 유지하고 그렇지 않은 경우 명확하게 나타냅니다.

순수 함수는 부작용이없고 새로운 개체를 반환하는 함수입니다. 따라서 으로 변경하면 인수가 반환되지만 복사 한 다음 새 값을 반환합니다.

예를 들어, 달성 할 수있는 방법은 deepcopy입니다.

from copy import deepcopy 

l1 = [1, 2, 3] 
l2 = deepcopy(l1) # Here deepcopy actually created a new object and returned it 

는 그 새로운 지식을 기준으로 약 which objects are mutable and which are not하고 조정하여 사례를 읽어 보시기 바랍니다.

+0

모든 오브젝트 및 유형에 deepcopy를 사용할 수 있습니까? –

+1

'__decopy__' 기능을 가진 모든 개체에 적용 할 수 있습니다. 'deepcopy'는 모두이 메소드를 호출합니다. –

+0

나는이 deepcopy 기능을 정말 좋아한다. 정말 내 모든 걱정을 x)) 걸립니다!)! 이전에는 그것을 보지 못했지만 몇 년 동안 파이썬을 사용해 왔습니다. –

관련 문제