2017-11-11 1 views
0

저는 토론자의 대회를 시뮬레이션하기 위해 Python으로 스크립트를 작성하고 있습니다. 하지만 참조 문제로 패스처럼 보이는이 이상한 오류가 발생하지만 참조로 전달하여 영향을 받아서는 안되는 몇 가지 동작이 있습니다.참조 및 사전 복사본에 의한 Python 전달

기본적으로 팀은 각 팀이 처음으로 팀을 만들 때 두 필드가 모두 0으로 초기화되는 wins and losses 필드를 포함한 여러 필드가있는 팀 사전입니다.

그런 다음 df.apda_tournament()는 팀 사전을 가져 와서 시뮬레이션을 기반으로 팀의 승리와 손실을 제공하도록 변경하고 업데이트 된 팀 사전을 반환합니다.

참조로 통과하는 방식 때문에 팀 사전은 df.apda_tournament()에 전달되고 반환되는 팀 사전은 전달 된 사전의 레코드의 승리 및 손실을 변경하고 반환하는 것으로 변경되면 모두 끝납니다. . 따라서 :

apda_results == apda_teams 

예상대로 True를 반환합니다.

이상한 점은 df.apda_tournament()가 apda_teams가 복사 한 원본 팀 사전을 변경한다는 것입니다. 따라서 다음과 같이 끝납니다.

apda_teams == teams 

또한 true를 반환합니다. 이상하게도 apda_teams는 복사본 대신 팀에 대한 참조 일 뿐이라고 선언했기 때문에 append_teams는 함수 외부에서 선언 한 이후로는 기대하지 않습니다.

누군가 여기서 무슨 일이 일어나는지 정확히 설명 할 수 있습니까? 또한 apda_teams가 실제로 팀 사전의 고유 한 복사본이며 메모리의 레코드에 대한 참조가 아닌 것을 어떻게 피할 수 있습니까?

import debate_functions as df 

dbtr_num = 64 
team_num = dbtr_num/2 
dbtr_mn_mn = 200 
dbtr_mn_std = 80 
dbtr_std_mn = 80 
dbtr_std_std = 60 
judge_bias = 70 

dbtrs = df.make_debaters(dbtr_num, dbtr_mn_mn, dbtr_mn_std, dbtr_std_mn, dbtr_std_std) 
teams = df.make_teams(dbtrs, dbtr_mn_mn, dbtr_mn_std) 
print(teams) 
apda_teams = teams 
para_teams = teams 

apda_results = df.apda_tournament(5, apda_teams, judge_bias) 
print('Check this') 
print(apda_results == apda_teams) 
print(apda_teams == teams) 

가 반환 실행 : 파이썬 목록에서

Check this 
True 
True 
+0

파이썬은 참조 또는 값 개념을 통한 전달과 함께 C처럼 작동하지 않습니다. 짧은 이야기를 짧게 자르기 : 명시 적으로 사전을 복사하지 않으면 호출 및 과제에서 동일한 객체를 유지합니다. –

+0

그래, 분명히 apda_teams에 명시 적으로 복사 한 다음 apda_teams의 함수 만 호출하면 팀이 수정되는 것처럼이 코드의 팀에 대해 궁금해했다. –

답변

0

, 사전 (우리가 내용을 수정할 수 있습니다) 변경할 수 있습니다 아래의 첨부

는 코드입니다. 따라서 목록을 전달하거나 사전을 함수에 전달하거나 변수에 할당 할 때마다 주어진 변수의 참조를 가리 킵니다.

문자열, 숫자, 튜플은 변경할 수 없습니다 (콘텐츠는 수정할 수 없습니다). 그래서 당신이 튜플을 문자열로 만들거나, 함수에 번호를 매기거나, 변수에 할당 할 때마다 그냥 값을 복사합니다.

+0

예, 이해했습니다. 그 이유가 (apda_results == apda_teams) True로 평가됩니다. 내가 궁금한 점은 apda_teams가 함수에 전달 될 때 변경되는 팀의 사본 인 이유 (apda_teams == teams)도 true로 평가되는 이유입니다. 팀은 어떤 기능도 통과하지 못해도 apda_teams가 함수에 전달 됨으로써 팀이 변경되고 있습니다. –

+0

지연에 대해 사과 드리며, apda_teams = teams (과제와 동일하게 지정), apda_teams = dict (팀) 또는 list apda_teams = list (팀)과 같이 deepcopy를 수행해야합니다. –

관련 문제