2012-05-10 4 views
1

파이썬 함수 func(A)이 있습니다. Anumpy.array이고 반복해서 반복해서 복사하는 것을 주저 할 정도로 커질 수 있습니다. 이 func(A)은 A의 내용을 변경하려고합니다. 이건 파이썬 초보자 문제입니다. 나는 C로 프로그래밍하는 데 익숙했고 포인터로 처리 할 수 ​​있었다. A의 내용을 변경하여 func(A) 범위 밖에서도 변경 사항을 적용하려면 어떻게해야합니까?python : 함수 매개 변수 업데이트 문제

+0

이 [이] [1] 유사 게시물에 대한 응답이 귀하의 질문에 대답하지 않습니다? [1] : http://stackoverflow.com/questions/10149416/numpy-modify-array-in-place –

+0

나는 파라미터 전역 변수하지 않을 것을 주장한다고 생각. 그것은 클래스의 멤버 일 수 있습니다. 나는 그것을 시도 할 것이지만 실제 문제는 변수를 함수에 전달할 때 실제로 어떤 일이 일어나는지 알지 못한다. 콘텐츠를 복사하지 않거나 파이썬에서 "참조로 전달"또는 "값으로 전달"과 같은 것이 없습니다. C에서 포인터는 처음에 이해하기 힘들었지 만 이해 했었고 지금은 ... –

+0

이것은 전역과는 아무런 관련이 없습니다. 파이썬에서 모든 인수를 참조로 전달했다고 생각할 수 있습니다. –

답변

6

tl; dr은 귀하의 경우에 기본적으로 이미 있습니다. 메소드에서 레이블 A에 새 값을 지정하지 않으면 A는 전달한 객체에 대한 참조가됩니다. 즉, A에 대한 모든 수정은 원래 객체를 사용하는 다른 곳으로 변경합니다.

예 :

>>> def foo(A): 
...  print A[0] 
...  A[0] = 2 
...  print A[0] 
... 
>>> a = [0, 1, 2] 
>>> foo(a) 
0 
2 
>>> a 
[2, 1, 2] 
>>> def bar(A): 
...  print A[0] 
...  A = [0, 1, 2] 
...  A[0] = 2 
...  print A[0] 
... 
>>> a = [0, 1, 2] 
>>> bar(a) 
0 
2 
>>> a 
[0, 1, 2] 
+1

+1. 즉,'numpy' 배열은 변경 가능합니다. 그러나 일부 numpy 함수는 복사본을 반환합니다. 어레이를 복제하는 대신 돌연변이를 일으킬 수있는 몇 가지 기본 사항을 설명해 두는 것이 좋습니다. (item assignment, in-place mathematical operations 등) – senderle

+0

+1 C++ 개발자로서 직접, 변수에 반대되는 레이블을 사용하여 파이썬에 대한 내 마음을 감싸는 데 꽤 오래 걸렸습니다. 인터넷 어딘가에 그림이있는 멋진 페이지가있었습니다 ... 이제 어디로 갔습니까? – JoeFish

+0

나는 그것을 얻지 않았다. 할당없이 어레이를 업데이트하려면 어떻게해야합니까? 실제 연산은'A = A + k * C'' k는 스칼라이고 C는 로컬'numpy.array'입니다. 그리고 tl; dr은 무엇입니까? –

0

A로 전달하는 매개 변수가 전역 매개 변수 인 경우 매개 변수 A의 값을 변경할 수 있습니다. 다른 방법은 변수를 함수에서 함수로 전달하는 것입니다. 에서 나는 파이썬에서 무엇을 이해하는지, 그렇게 할 때 객체는 복사되지 않습니다.

+0

사실, A는 전역 변수가 아니며 클래스의 멤버이고 func는 다른 클래스의 멤버입니다. –