[python] 파이썬에서 참조로 정수 전달

파이썬에서 어떻게 정수를 참조로 전달할 수 있습니까?

함수에 전달하는 변수의 값을 수정하고 싶습니다. 나는 파이썬의 모든 것이 가치로 전달된다는 것을 읽었지만 쉬운 트릭이 있어야합니다. 예를 들어 Java Integer에서는 Long, 등 의 참조 유형을 전달할 수 있습니다 .

  1. 어떻게 정수를 함수에 참조로 전달할 수 있습니까?
  2. 모범 사례는 무엇입니까?



답변

파이썬에서는 그렇게 작동하지 않습니다. 파이썬은 객체에 대한 참조를 전달합니다. 함수 내부에는 객체가 있습니다. 가능하면 해당 객체를 자유롭게 변경할 수 있습니다. 그러나 정수는 변경할 수 없습니다 . 한 가지 해결 방법은 변경 될 수있는 컨테이너에 정수를 전달하는 것입니다.

def change(x):
    x[0] = 3

x = [1]
change(x)
print x

이것은 기껏해야 추악하고 어색하지만 파이썬에서 더 잘할 수는 없습니다. 그 이유는 Python에서 할당 ( =)은 오른쪽의 결과 인 모든 객체를 가져 와서 왼쪽에있는 모든 객체 * (또는 적절한 함수에 전달)에 바인딩하기 때문입니다.

이를 이해하면 함수 내에서 불변 객체의 값을 변경할 수있는 방법이없는 이유를 알 수 있습니다. 불변이기 때문에 속성을 변경할 수 없으며 “변수”에 새 항목을 할당 할 수 없습니다. 값은 실제로 새 객체 (이전 객체와 구별됨)를 만들고 이전 객체가 로컬 네임 스페이스에있는 이름을 지정하기 때문입니다.

일반적으로 해결 방법은 원하는 개체를 반환 하는 것입니다.

def multiply_by_2(x):
    return 2*x

x = 1
x = multiply_by_2(x)

* 위의 첫 번째 예에서는 3실제로 x.__setitem__.


답변

참조로 전달해야하는 대부분의 경우는 호출자에게 둘 이상의 값을 반환해야하는 경우입니다. “모범 사례”는 여러 반환 값을 사용하는 것입니다. 이는 Java와 같은 언어보다 Python에서 훨씬 더 쉽습니다.

다음은 간단한 예입니다.

def RectToPolar(x, y):
    r = (x ** 2 + y ** 2) ** 0.5
    theta = math.atan2(y, x)
    return r, theta # return 2 things at once

r, theta = RectToPolar(3, 4) # assign 2 things at once


답변

값을 직접 전달하는 것이 아니라 전달 된 것처럼 사용합니다.

x = 7
def my_method():
    nonlocal x
    x += 1
my_method()
print(x) # 8

주의 사항 :

  • nonlocal 파이썬 3에서 소개되었습니다.
  • 둘러싸는 범위가 전역 범위 인 경우 global대신을 사용하십시오 nonlocal.


답변

실제로 가장 좋은 방법은 한 걸음 물러서서이 작업이 정말로 필요한지 묻는 것입니다. 함수에 전달하는 변수의 값을 수정하려는 이유무엇 입니까?

빠른 해킹을 위해해야 ​​할 경우 가장 빠른 방법은 list정수 를 전달하고 [0]mgilson의 답변에서 알 수 있듯이 정수를 사용할 때마다 사용하는 것입니다.

좀 더 중요한 일을해야한다면 속성 class이있는 a 를 작성하여 int설정하면됩니다. 물론 이것은 당신이 수업과 속성에 대한 좋은 이름을 생각해 내도록 강요합니다. 만약 당신이 아무것도 생각할 수 없다면, 돌아가서 문장을 몇 번 다시 읽은 다음 list.

보다 일반적으로 일부 Java 관용구를 Python으로 직접 이식하려는 경우 잘못하고있는 것입니다. ( static/ 와 같이) 직접 대응하는 것이 있더라도 @staticmethodJava에서 사용하기 때문에 대부분의 Python 프로그램에서 사용하고 싶지 않습니다.


답변

Python에서 모든 값은 Java의 기본 요소가 아닌 것처럼 참조 (객체에 대한 포인터)입니다. 또한 Java와 마찬가지로 Python은 값으로 만 전달합니다. 따라서 의미 적으로는 거의 동일합니다.

질문에서 Java를 언급했기 때문에 Java에서 원하는 것을 어떻게 달성하는지보고 싶습니다. Java로 표시 할 수 있다면 Python에서도 정확히 동일하게 수행하는 방법을 보여줄 수 있습니다.


답변

NumPy와 단일 소자 어레이는 가변하고 수치 파이썬 변수 것처럼 아직 대부분의 목적을 위해, 그것은 평가 될 수있다. 따라서 단일 요소 목록보다 참조 번호 별 컨테이너가 더 편리합니다.

    import numpy as np
    def triple_var_by_ref(x):
        x[0]=x[0]*3
    a=np.array([2])
    triple_var_by_ref(a)
    print(a+1)

산출:

3


답변

비단뱀적인 방법은 아닐 수도 있지만 이렇게 할 수 있습니다.

import ctypes

def incr(a):
    a += 1

x = ctypes.c_int(1) # create c-var
incr(ctypes.ctypes.byref(x)) # passing by ref