2016-07-20 2 views
1

파이썬에서 이해하고있는 것처럼 함수 매개 변수에 변수를 전달하면 이미 원래 변수를 참조합니다. 내 구현에 내가 함수에 전달 변수를 동일시하려고 할 때 빈 목록 결과.참조로 파이썬 호출 문제

#on the main ------------- 
temp_obj = [] 
obj = [ 
    {'name':'a1', 'level':0}, 
    {'name':'a2', 'level':0}, 
    {'name':'a3', 'level':1}, 
    {'name':'a4', 'level':1}, 
    {'name':'a5', 'level':2}, 
    {'name':'a6', 'level':2}, 
] 

the_result = myFunction(obj, temp_obj) 

print(temp_obj) 
#above print would result to an empty list 
#this is my problem 

#end of main body ------------- 


def myFunction(obj, new_temp_obj): 
    inside_list = [] 
    for x in obj[:]: 
     if x['level'] == 0: 
       inside_list.append(x) 
       obj.remove(x) #removing the element that was added to the inside_list 

    new_temp_obj = obj[:] #copying the remaining element 

    print(new_temp_obj) 
    # the above print would result to 
    #[{'name': 'a3', 'level': 1}, {'name': 'a4', 'level': 1}, {'name': 'a5', 'level': 2}, {'name': 'a6', 'level': 2}] 

    return inside_list 

나는 뭔가를 놓치고 있습니까 아니면 참조로 파이썬 전화의 개념을 오해 않았다

이 내 코드?

+0

'obj [:]'대신'list (obj)'를 사용하십시오. 그것은 더 좋게 본다. – pushkin

답변

1

파이썬은 참조로 전달되지 않습니다. 그것은 목표물에 의한 것입니다.

는 다음과 같은 두 가지 기능을 고려 :

def f(mylist): 
    mylist = [] 

def g(mylist): 
    mylist.append(1) 

지금의 내가 그들에게 전화를 가정 해 봅시다.

mylist = [1] 
f(mylist) 
print(mylist) 

mylist = [1] # reset the list 
g(mylist) 
print(mylist) 

출력은 무엇입니까?

파이썬이 값 - 인 경우 함수는 목록의 복사본을 사용하므로 함수를 반환하면 함수를 수정해도 원래 목록에 영향을 미치지 않습니다. 따라서 두 경우 모두 원본 목록 인 [1]을 인쇄하게됩니다.

파이썬 경우 패스 별 참조, 기능은 객체에 대한 참조를 받아들이하고 수정하는 기준 참조는 상기 제 1 출력이 [] 및 제, [1,2] 것이다 그래서 실제 객체를 수정할 것이 있었다.

이 예제를 실행하면 첫 번째 출력은 [1] (영향이없는 경우 목록)이고 두 번째 출력은 [1,2] (영향을받는 목록)이라는 것을 알 수 있습니다.

당신이 new_temp_obj = obj[:] O_O, 파이썬은 새로운 객체 obj[:]를 구성하고 그것에게 이름 new_temp_obj을주고있다.

append 인 경우 Python은 new_temp_obj을 찾아 요소를 추가합니다. 전달한 인수는 목록을 찾을 위치를 알려줍니다.

당신은 메모리에 완전히 새로운 위치에 완전히 새로운 객체를 생성하고 단순히 이것은 또 다른 새로운 목록 객체에 대한 new_temp_obj 참조 할 것 new_temp_obj

+0

잘 설명해 주셔서 감사합니다. 그것은 나를 많이 돕고 새로운 것을 이해합니다. 다시 한번 감사드립니다. –

+0

도와 드리겠습니다! 아직도 질문이 있으시면, [여기] (http://robertheaton.com/2014/02/09/pythons-pass-by-object-reference-as-explained-by-philip-k-dick/)는 철저한 설명. – pushkin

1
new_temp_obj = obj[:] #copying the remaining element 

, 그것은 동일한 이름을 부여. id을 사용하면 id이이 지정으로 변경됩니다.

변경이로 :

new_temp_obj[:] = obj[:] 

당신은 당신의 예상 된 결과를 볼 수 있습니다.

+0

답변 해 주셔서 감사합니다. –