저는 토론자의 대회를 시뮬레이션하기 위해 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
파이썬은 참조 또는 값 개념을 통한 전달과 함께 C처럼 작동하지 않습니다. 짧은 이야기를 짧게 자르기 : 명시 적으로 사전을 복사하지 않으면 호출 및 과제에서 동일한 객체를 유지합니다. –
그래, 분명히 apda_teams에 명시 적으로 복사 한 다음 apda_teams의 함수 만 호출하면 팀이 수정되는 것처럼이 코드의 팀에 대해 궁금해했다. –