2011-09-29 2 views
1

Python 함수 (def)를 변경하여 변경 불가능한 형식에서도 참조로 결과를 반환 할 수있는 방법이 있습니까?Python : 참조 변수 (해킹)

제안서 응용 프로그램 (서브 루틴 스왑) :
def swap(a, b):
.....a,b = b,a

참고 :이 질문의 답 아닌 함수로
def swap(a, b):
.....return b,a

작품!


예를 들어 in-place에서 작동하는 random.shuffle (a) 함수가 있습니다. 제 아이디어는 Fortran/C++로 작성된 함수를 호출하고 파이썬을 통해 호출하는 것입니다. 작동하지만 단점도 있습니다.
참고 :
""과 "def"모두 기능상 다음과 같은 문제가 있습니다. a, b = swap(a, b) 변수 순서에주의해야합니다. 내 제안 (가능한 경우) 서브 루틴은 swap(a, b)같이 사용되므로 변수의 순서를 신경 쓸 필요가 없습니다.

+0

내가 바로 그것을 가지고 있다면 나도 몰라,하지만 당신은'lambda' 기능을 찾고있는 것 같다. 더 자세한 설명과 예를 들려 줄 수 있습니까? – heltonbiker

+1

아니요 당신은 그 사실을 확실히 원하지 않습니다. – JBernardo

+1

"lambda"와 "def"(함수로)는 모두 다음과 같은 문제가 있습니다 : 변수의 순서를 신경 써야하는'a, b = swap (a, b)'. 내 제안에서 (가능한 경우) 서브 루틴은'swap (a, b)'로 사용되므로 변수의 순서를 신경 쓰지 않아도됩니다. – Developer

답변

4

파이썬의 모든 이름은 참조입니다. 아니요, 사용할 수있는 "외부"참조 (예 : C++ 의미)가 없습니다. 변경할 수있는 객체를 전달해야하며 함수에서이 객체를 변경할 수 있습니다. 그러나 다시 새로운 가치를 되돌려주는 것이 선호되는 방법이어야합니다.

+1

내 의견을 참조하십시오 내 제안의 장점을 보여줍니다 질문. – Developer

+1

@ 개발자 : 아니요, 장점이 없습니다. 불가능하기 때문 만이 아닙니다. 그것은 관용적 인 코드가 아닙니다. 관용적 인 교환은'a, b = b, a'입니다. –

+0

스왑은 아이디어를 설명하기위한 예일뿐입니다. – Developer

3

아니요, 주어진 객체를 참조로 가져 왔기 때문에 존재하지 않지만 다시 할당하면 다시 변경되지 않습니다.

이 경우에는 변경할 수있는 컨테이너 (목록, 사전, 속성이있는 개체)로 작업해야합니다.

2

파이썬에는 "쓰기 포인터"를 전달할 수있는 방법이 없습니다. 개체와 이름을 전달할 수 있으므로 (예를 들어, 호출 수신자는 setattr을 사용할 수 있음) 목록과 색인을 전달할 수 있습니다. 컨텍스트가없는 "수정 가능한 셀의 주소"와 같은 것은 없습니다 ... 그러나 컨텍스트 (네임 스페이스, 배열)도 필요로하는 이름이나 인덱스 만 있습니다.

일반적으로 쓰기 포인터를 전달해야하는 경우 Python의 솔루션은 호출 수신자가 값을 설정하는 데 사용할 수있는 "setter"함수를 전달하는 것입니다. 예를 들어

:

def foo(setter): 
    setter(42) 

def bar(): 
    x = [1,2,3,4] 

    def setFirst(value): 
     x[0] = value 

    foo(setFirst) 

    print x[0] # --> 42