2017-12-21 5 views
0

다음 코드 줄을 실행할 때 cv2를 사용하여 원본 이미지 (즉, img)를 그리는 것이 좋습니다. 내가 말할 수있는 한 최선을 다했을 때, 그것은 그렇게했지만 img를 수정했다.실수로 인수를 수정하지 않도록하는 방법을 참조하여 전달 된 인수 복사 모범 사례

cbImg = cv2.drawChessboardCorners(img, (nx, ny), corners, ret) 

나는 파이썬이 참조로 전달된다는 것을 알고 있는데, 이는 인수가 메소드에 의해 변경 될 수 있음을 의미합니다. 원본 이미지를 수정 피하기 위하여, (아래 나타낸 바와 같이, 예를 들어) I이 방법을 수정할 수 있기 때문에 I는 cv2.drawChessboardCorners()에 사본을 전달

cbImg = cv2.drawChessboardCorners(copy.copy(img), (nx, ny), corners, ret) 

사본에서 작동 할 필요가있다. 그러나 필자는이 방법으로 복사가 수행되는 많은 예제를 보았습니다.

어디에서 복사해야하는지 모범 사례가 있습니까? 즉, 다른 사람의 방법을 사용하는 경우 원본 이미지가 수정되지 않도록 항상 복사본을 전달해야합니까? 또는 내 자신의 메서드를 작성할 때 실수로 다른 사람의 주장을 수정하지 않도록 내 메서드 내에서 복사본을 수행해야합니까? 또한, 참조로 전달 된 인수를 수정해야한다고 가정하는 것이 일반적입니까?

+0

** ** Python에서는 ** ** 참조로 전달되지 않습니다. 파이썬은 pass-by-reference 의미론을 지원하지 않으며 모든 함수 호출은 동일한 평가 전략을 사용합니다. –

+2

다른 말로하면, "파이썬은 참조에 의한 전달이라는 것을 이해합니다. 이는 인수가 메소드에 의해 변경 될 수 있음을 의미합니다." 잘못된 것입니다. 참조에 의한 전달에서는 호출자 *에서 인수에 대한 할당이 * 표시됩니다. 즉, f (x) : x = 13이면 호출자의 'f (y)'가 y를 재 할당합니다. 파이썬에서는 그렇지 않습니다. 기술 이름은 Python에서 "할당에 의한 전달"이라고도하는 [ "call by sharing"] (https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)입니다. 자바, 루비, 자바 스크립트 등 대부분의 현대 언어에서 사용하는 것과 동일한 전략입니다. –

+0

"object"가 아닌 "argument"에 질문을 수정했습니다. 질문을하기에 더 좋은 용어가 있으면 명확히하기 위해 질문을 편집 해 드리겠습니다. 기본 질문은 그대로 유지됩니다.이 메소드는 전달 된 내용을 수정합니다. 복사가 수행되는 위치 (즉, 메소드에 복사를 전달하거나 메소드 내에서 사본을 작성)에 대한 우수 사례가 있습니까? – user2514157

답변

1

함수가 인수를 수정하는지 여부를 명확히하는 것이 가장 좋습니다. 이상적으로, 그들은 그렇게 쉽게 추론하기가 쉽지 않으므로 그렇지 않을 것입니다. 데이터가 크지 않은 경우 새 값을 만들고 반환하는 옵션입니다.

함수가 인수를 수정한다는 사실을 알고 있고 원래 값과 수정 된 값이 모두 필요하면 사본을 만드십시오.

관련 문제