programing

Python에서 값 전달

nasanasas 2020. 12. 6. 21:37
반응형

Python에서 값 전달


이 질문에 이미 답변이 있습니다.

목록, 배열과 같은 컬렉션을 파이썬의 다른 함수에 전달할 때 복사본을 만들거나 포인터일까요?


파이썬 은 값으로 객체에 대한 참조를 전달합니다 .

Python은 값 (예 : Java)으로 객체에 대한 참조를 전달하며 Python의 모든 것은 객체입니다. 간단하게 들리지만 일부 데이터 유형은 값에 의한 전달 특성을 나타내는 반면 다른 데이터 유형은 참조에 의한 전달처럼 작동하는 것처럼 보입니다. 거래는 무엇입니까?

변경 가능한 객체와 변경 불가능한 객체를 이해하는 것이 중요합니다. 문자열, 튜플 및 숫자와 같은 일부 개체는 변경할 수 없습니다. 함수 / 메소드 내부에서 변경하면 새 인스턴스가 생성되고 함수 / 메소드 외부의 원래 인스턴스는 변경되지 않습니다. 목록 및 사전과 같은 다른 개체는 변경 가능하므로 개체를 제자리에서 변경할 수 있습니다. 따라서 함수 / 메소드 내부의 개체를 변경하면 원래 개체도 외부로 변경됩니다.


문제는 전체 참조 / 값 개념이 파이썬에 적합하지 않다는 것입니다. 파이썬에는 변수의 "값"이 없습니다. 파이썬에는 객체를 참조하는 객체와 이름 만 있습니다.

따라서 함수를 호출하고 다음과 같이 괄호 안에 "이름"을 넣을 때 :

def func(x): # defines a function that takes an argument
    ... # do something here

func(myname) # calling the function

myname가리키는 실제 객체 이름 myname 자체가 아니라 전달 됩니다 . 함수 내에서 전달 된 동일한 객체를 참조하기 위해 다른 이름 ( x)이 제공됩니다.

변경 가능한 경우 함수 내부의 개체를 수정할 수 있지만 외부 이름이 가리키는 것을 변경할 수는 없습니다 . 당신이 할 때 일어나는 것과 똑같은

anothername = myname

따라서 다음과 같이 귀하의 질문에 답할 수 있습니다.

"값에 의한 전달"이지만 모든 값은 객체에 대한 참조 일뿐입니다.


여기에 대한 답변이 도움이되었지만, 아직 다루지 않은이 미세한 차이를 보여줄 필요가 있다는 것을 알게되었습니다. 이는 후속 CL 실험에서 스스로 입증했습니다.

  1. 불변 객체 ALONE은 함수 호출 내에서 변경할 수 없습니다. (지금까지 대답이 그렇게 많이 말했어 ...)
  2. 그러나 변경 가능한 객체에 포함 된 변경 불가능한 객체는 메서드 호출 내에서 다시 할당 될 수 있습니다.

'num'은 변경할 수없는 Number 객체이기 때문에 여기서 변경되지 않습니다. [내 포인트 1을 지원합니다.] :

def incr_num(num):
    num += 1

num = 0

num
0

incr_num(num)

num
0

여기서 'list [0]'도 변경할 수없는 Number 객체입니다.

def incr_list(list):
    list[0] += 1

list = [0]

list[0]
0

incr_list(list)

list[0]
1

그렇다면 변경 불가능한 Number 객체 인 'list [0]'은 어떻게 변경 되었습니까 (제 포인트 2를 지원함). 위 예제의 Number 객체 'num'은 변경되지 않았습니까? 변경 불가능한 Number 객체 'list [0]'은 변경 가능한 목록 객체 'list'내에 포함되어있는 반면, 첫 번째 예제의 'num'은 연속되지 않은 Number 객체입니다.

의도는 좋지만 @Stephen Pape 최고 등급 답변 (아래 인용)과 다른 유사한 답변이 완전히 정확하지 않다고 생각합니다 (그리고이 답변을 작성하게 된 동기).

문자열, 튜플 및 숫자와 같은 일부 개체는 변경할 수 없습니다. 함수 / 메소드 내부에서 변경하면 새 인스턴스가 생성되고 함수 / 메소드 외부의 원래 인스턴스는 변경되지 않습니다.

위의 두 번째 코드 실험에서는 메서드 내에서 Number 객체 ( 'list [0]')가 변경된 다음 함수 외부의 원래 인스턴스가 변경되는 것을 보여줍니다.


참조가 전달되지만 매개 변수가 변경 불가능한 객체 인 경우 메서드 내에서 수정하면 새 인스턴스가 생성됩니다.


개체가 전달됩니다. 복사본이 아니라 기본 개체에 대한 참조입니다.


또한 copy모듈을 살펴 보는 것이 좋습니다 .

Python documentation for copy

It will help you to understand the underlying issues and how to use it to perform your own deep copy.


By reference:

>>> x = [0,1,2,3]
>>> def foo(x_list):
    x_list[0] = 1


>>> foo(x)
>>> x
[1, 1, 2, 3]

Please let me give a humble example

def swap(a, b):
    x = a
    print id(x)
    print id(a)
    print id(b)
    a = b

    print id(a)
    b = x
    print id(b)
    a[0]= '20'




var1 = ['1','2','3','4']
var2 = ['5','6','7','8','9']
print id(var1)
print id(var2)

swap(var1, var2)

print id(var1)
print id(var2)
print var1
print var2

which produces the following result

28329344 var1 28331264 var2 28329344 x 28329344 a 28331264 b After a = b 28331264 a after b = x 28329344 b after return 28329344 var1 28331264 var2 ['1', '2', '3', '4'] ['20', '6', '7', '8', '9']

Mapping to the memory addresses 28329344 28331264 var1 var2 a b x After a=b a After b=x b After a[0] = '20' [0] = '20' After return ['1','2','3','4'] ['20', '6', '7', '8', '9']

참고URL : https://stackoverflow.com/questions/534375/passing-values-in-python

반응형