programing

Python에서 참조로 정수 전달

cafebook 2023. 7. 27. 22:18
반응형

Python에서 참조로 정수 전달

파이썬에서 참조로 정수를 전달하려면 어떻게 해야 합니까?

함수에 전달하는 변수의 값을 수정하고 싶습니다.파이썬의 모든 것은 가치에 의해 통과되지만 쉬운 속임수가 있어야 한다는 것을 읽었습니다.를 들어,에서는 " " ", ", ", ", "의 참조 할 수 있습니다.Integer,Long 타기.

  1. 참조를 통해 정수를 함수로 전달하려면 어떻게 해야 합니까?
  2. 모범 사례는 무엇입니까?

파이썬에서는 그렇게 작동하지 않습니다.Python은 개체에 대한 참조를 전달합니다.함수 안에는 개체가 있습니다. 가능하면 개체를 자유롭게 변형할 수 있습니다.그러나 정수는 불변입니다.한 가지 해결 방법은 변환 가능한 컨테이너에 정수를 전달하는 것입니다.

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

x = [1]
change(x)
print x

이것은 기껏해야 추악하고 서투르지만, 당신은 파이썬에서 더 잘 할 수 없을 것입니다.그 이유는 파이썬에서 할당(=)는 오른쪽의 결과인 모든 개체를 가져다가 왼쪽의 모든 개체에 결합합니다 *(또는 적절한 함수로 전달).

이것을 이해함으로써, 우리는 왜 함수 안에 있는 불변의 객체의 값을 바꿀 방법이 없는지 알 수 있습니다. 당신은 그것이 불변이기 때문에 그것의 속성을 바꿀 수 없습니다.새 개체를 생성하고 로컬 네임스페이스에서 이전 개체가 가지고 있던 이름을 지정하는 것이기 때문에 "이름"을 새 값으로 할당할 수 없습니다.

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

def multiply_by_2(x):
    return 2*x

x = 1
x = multiply_by_2(x)

의 첫 에서는 *위의첫번사째례서에,서▁above▁*사에▁*▁case례째▁the,,3는 에실로전니다달됩제다로 넘어갑니다.x.__setitem__.

참조로 전달해야 하는 대부분의 경우 두 개 이상의 값을 호출자에게 반환해야 합니다."best practice"는 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에되었습니다.
  • 범위인 에는 포함범인위범위경우를 합니다.globalnonlocal.

아마도 그것은 부정적인 방법이 아닐 수도 있지만, 당신은 이것을 할 수 있습니다.

import ctypes

def incr(a):
    a += 1

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

정말로, 가장 좋은 방법은 한 발 물러서서 이것이 정말로 필요한지 물어보는 것입니다.함수에 전달할 변수의 값을 수정하려는 이유는 무엇입니까?

빠른 해킹을 위해 그것을 해야 한다면, 가장 빠른 방법은 시험을 통과하는 것입니다.list정수를 유지하고, a를 붙입니다.[0]엠길슨의 대답이 보여주듯이, 그것의 모든 사용 주변.

만약 더 중요한 것을 위해 그것을 해야 한다면, 다음과 같이 쓰시오.class그것이 있습니다.int속성으로 설정할 수 있습니다.물론 이것은 여러분이 수업과 속성을 위한 좋은 이름을 생각해내도록 강요합니다. 만약 여러분이 아무 것도 생각나지 않는다면, 돌아가서 문장을 몇 번 더 읽고 나서, 다음을 사용하세요.list.

더 일반적으로, 만약 당신이 몇몇 자바 관용구를 파이썬으로 직접 이식하려고 한다면, 당신은 잘못하고 있는 것입니다.직접적으로 일치하는 것이 있을 때에도 (와 같이.static/@staticmethod), 자바에서 사용한다고 해서 대부분의 파이썬 프로그램에서 사용하고 싶지는 않을 것입니다.

list-of-length-1 트릭보다 약간 더 자가 문서화된 것은 오래된 빈 유형 트릭일 수 있습니다.

def inc_i(v):
    v.i += 1

x = type('', (), {})()
x.i = 7
inc_i(x)
print(x.i)

정답은 클래스를 사용하고 클래스 안에 값을 넣는 것입니다. 이것은 여러분이 원하는 대로 정확하게 참조로 통과할 수 있습니다.

class Thing:
  def __init__(self,a):
    self.a = a
def dosomething(ref)
  ref.a += 1

t = Thing(3)
dosomething(t)
print("T is now",t.a)

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)

출력:

7

파이썬에서 모든 값은 자바의 비원문과 마찬가지로 참조(객체에 대한 포인터)입니다.또한 Java와 마찬가지로 Python도 Pass by 값만 가지고 있습니다.그래서 의미론적으로, 그들은 거의 같습니다.

당신이 질문에서 자바를 언급했기 때문에, 저는 당신이 자바에서 원하는 것을 어떻게 성취하는지 보고 싶습니다.자바로 보여줄 수 있다면, 파이썬에서 정확히 동등하게 하는 방법을 보여줄 수 있습니다.

class PassByReference:
    def Change(self, var):
        self.a = var
        print(self.a)
s=PassByReference()
s.Change(5)     
class Obj:
  def __init__(self,a):
    self.value = a
  def sum(self, a):
    self.value += a
    
a = Obj(1)
b = a
a.sum(1)
print(a.value, b.value)// 2 2

Python에서는 모든 것이 값으로 전달되지만, 어떤 상태를 수정하고 싶다면 메소드로 전달된 목록이나 개체 내 정수 값을 변경할 수 있습니다.

정수는 파이썬에서 불변이며 일단 생성되면 변수에 대한 할당 연산자를 사용하여 값을 변경할 수 없습니다. 이전 주소가 아닌 다른 주소를 가리키도록 하고 있습니다.

파이썬에서 함수는 여러 값을 반환할 수 있습니다.

def swap(a,b):
    return b,a

a,b=22,55
a,b=swap(a,b)
print(a,b)

변수가 가리키는 기준을 변경하기 위해 불변 데이터 유형(int, long, float, complex, str, bytes, truple, frozenset)을 가변 데이터 유형(tearray, list, set, dict) 내부에 래핑할 수 있습니다.

#var is an instance of dictionary type

def change(var,key,new_value):
    var[key]=new_value

var =dict()
var['a']=33
change(var,'a',2625)
print(var['a'])

언급URL : https://stackoverflow.com/questions/15148496/passing-an-integer-by-reference-in-python

반응형