인수는 할당에 의해 전달됩니다 . 이것의 근거는 두 가지입니다.
- 전달 된 파라미터는 사실이다 기준 개체에 (그러나, 기준이되는 값으로 전달)
- 일부 데이터 유형은 변경 가능하지만 다른 유형은 변경 불가능
그래서:
당신이 전달하는 경우 변경 가능한 방법으로 개체를, 방법은 같은 객체에 대한 참조를 가져옵니다 당신은 당신의 마음의 기쁨으로 변이 할 수 있지만,이 방법에 대한 참조를 바인딩하는 경우, 외부 범위는 후에 그것에 대해 아무것도 몰라, 것 완료되었으므로 외부 참조는 여전히 원래 객체를 가리 킵니다.
당신이 전달하는 경우 불변 하는 방법에 오브젝트를, 당신은 여전히 외부 참조를 바인딩 할 수없고 심지어 개체를 변이 수 없습니다.
더 명확하게하기 위해 몇 가지 예를 들어 보겠습니다.
리스트-가변 타입
메소드에 전달 된 목록을 수정 해 봅시다 :
def try_to_change_list_contents(the_list):
print('got', the_list)
the_list.append('four')
print('changed to', the_list)
outer_list = ['one', 'two', 'three']
print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)
산출:
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
전달 된 매개 변수 outer_list
는 복사본이 아닌에 대한 참조 이므로 변경 목록 메소드를 사용하여 변경하고 외부 범위에 변경 사항을 반영 할 수 있습니다.
이제 매개 변수로 전달 된 참조를 변경하려고 할 때 어떤 일이 발생하는지 봅시다 :
def try_to_change_list_reference(the_list):
print('got', the_list)
the_list = ['and', 'we', 'can', 'not', 'lie']
print('set to', the_list)
outer_list = ['we', 'like', 'proper', 'English']
print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)
산출:
before, outer_list = ['we', 'like', 'proper', 'English']
got ['we', 'like', 'proper', 'English']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'English']
때문에 the_list
매개 변수가 그것에 새 목록을 할당 값에 의해 전달 된 방법 이외의 코드를 볼 수 있다는 아무런 영향을 미치지 않습니다. 는 the_list
의 복사본이었다 outer_list
참조, 우리는 한 the_list
새 목록에 지점을하지만, 변경할 수있는 방법이 없었다 outer_list
뾰족한는.
문자열-불변의 타입
불변이므로 문자열의 내용을 변경하기 위해 할 수있는 일은 없습니다
이제 참조를 변경해 봅시다
def try_to_change_string_reference(the_string):
print('got', the_string)
the_string = 'In a kingdom by the sea'
print('set to', the_string)
outer_string = 'It was many and many a year ago'
print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)
산출:
before, outer_string = It was many and many a year ago
got It was many and many a year ago
set to In a kingdom by the sea
after, outer_string = It was many and many a year ago
다시 말하지만 the_string
매개 변수가 값으로 전달되었으므로 새 문자열을 할당하면 메서드 외부의 코드에서 볼 수 없었습니다. 는 the_string
의 복사본이었다 outer_string
참조, 우리는 한 the_string
새로운 문자열로 포인트를하지만, 변경할 수있는 방법이 없었다 outer_string
뾰족한는.
나는 이것이 약간의 정리를 바랍니다.
편집 : 이것은 @David가 처음에 "실제 참조로 변수를 전달하기 위해 할 수있는 일이 있습니까?"라는 질문에 대답하지는 않습니다. 그 작업을 해보자.
우리는 어떻게이 문제를 해결합니까?
@Andrea의 답변에서 알 수 있듯이 새로운 값을 반환 할 수 있습니다. 이것은 물건이 전달되는 방식을 바꾸지는 않지만 원하는 정보를 다시 얻을 수있게합니다.
def return_a_whole_new_string(the_string):
new_string = something_to_do_with_the_old_string(the_string)
return new_string
# then you could call it like
my_string = return_a_whole_new_string(my_string)
반환 값을 사용하지 않으려면 값을 보유하고 함수에 전달하거나 목록과 같은 기존 클래스를 사용하는 클래스를 만들 수 있습니다.
def use_a_wrapper_to_simulate_pass_by_reference(stuff_to_change):
new_string = something_to_do_with_the_old_string(stuff_to_change[0])
stuff_to_change[0] = new_string
# then you could call it like
wrapper = [my_string]
use_a_wrapper_to_simulate_pass_by_reference(wrapper)
do_something_with(wrapper[0])
비록 약간 성가신 것 같습니다.