파이썬에서의 전달 값 [복제
-
22-08-2019 - |
문제
이 질문은 이미 여기에 답이 있습니다.
- 참조로 변수를 어떻게 전달합니까? 26 답변
목록과 같은 컬렉션을 전달할 때 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
그러므로 나는 당신의 질문에 다음과 같이 대답 할 수 있습니다.
"통과 값"이지만 모든 값은 객체에 대한 참조 일뿐입니다.
여기서 답은 도움이되었지만, 내가 보지 못한이 미세한 차이를 보여줄 필요성을 발견했습니다.
- 불변의 객체만으로는 함수 호출 내에서 변경할 수 없습니다. (지금까지 대답은 그렇게 많이 말했습니다 ...)
- 그러나 변이 가능한 객체 안에 포함 된 불변의 객체는 메소드 호출 내에 다시 할당 될 수 있습니다.
'num'은 불변의 숫자 객체이기 때문에 여기에서 변경되지 않습니다 [지점 1 지원] : :
def incr_num(num):
num += 1
num = 0
num
0
incr_num(num)
num
0
'목록 [0]'여기에 불변의 숫자 객체도 있습니다.
def incr_list(list):
list[0] += 1
list = [0]
list[0]
0
incr_list(list)
list[0]
1
그렇다면 어떻게 불변의 숫자 객체 인 '목록 [0]'은 어떻게 변경되었고 (내 포인트 2를 뒷받침합니다.) 위의 예의 숫자 객체 'num'은 그렇지 않았습니까? 불변의 숫자 객체 '목록 [0]'은 Mutable List 객체 '목록'내에 포함되며 첫 번째 예제의 'num'은 컨티어가 아닌 숫자 객체입니다.
의도가 좋았지 만 느낍니다 @stephen pape 최고급 답변 (아래 인용)과 다른 유사한 답변은 완전히 정확하지 않았습니다 (그리고이 답변을 작성하도록 동기를 부여했습니다).
줄, 튜플 및 숫자와 같은 일부 물체는 불변입니다. 함수/메소드 내부에서 변경하면 새 인스턴스가 생성되며 함수/메소드 외부의 원래 인스턴스는 변경되지 않습니다.
위의 두 번째 코드 실험은 메소드 내에서 숫자 객체 ( 'list [0]')가 변경되고 있으며 함수 외부의 원래 인스턴스가 변경되었습니다.
참조가 전달되지만 매개 변수가 불변의 객체 인 경우 메소드 내에서 수정하면 새 인스턴스가 생성됩니다.
객체가 전달됩니다. 사본이 아니라 기본 물체에 대한 참조.
참조로 :
>>> x = [0,1,2,3]
>>> def foo(x_list):
x_list[0] = 1
>>> foo(x)
>>> x
[1, 1, 2, 3]
겸손한 모범을 드리겠습니다
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
다음 결과를 생성합니다
28329344 var1 28331264 var2 28329344 x 28329344 a 28331264 b 이후 b = b 28331264 a 후 b = x 28329344 b 이후 28329344 var1 28331264 var2 [ '1', '2', '3', '4', '6', '7', '8', '9']
메모리 주소에 매핑 28329344 28331264 var1 var2 ab x [0] = '20'[0] [0] = '20'후 [ '1', '2', '3', '4'] [ '20', '6', '7', '8', '9']