2013-10-05 7 views
-4

아래 함수를 실행하기 전에 l1은 빈 목록이지만 함수를 실행 한 후 왜 [1, 2, 3]입니까?python 함수 변수 범위

def copylist(lsource, ldest): 
    for e in lsource: 
     ldest.append(e) 
    print 'ldest =',ldest 


l1 = [] 
l2 = [1, 2, 3] 
copylist(l2, l1) 
print l1 # displays [1, 2, 3] 
print l2 # displays [1, 2, 3] 
+4

그게 당신이 할 함수를 작성한거야? 'lsource'의 데이터를'ldest'에 복사하기 때문에'l1'에 복사합니다. – BrenBarn

+1

답변에 대한 의견을 기반으로 위에서 질문 한 것보다 더 많은 질문이 있기 때문에 나는 다운 voting입니다. 완전한 답을 원하면 완전한 질문을해야합니다. – SethMMorton

+0

함수가 제대로 작동하기 때문입니다. 너는 무엇을 기대 했는가? –

답변

1

다른 언어와 다를 수 있으므로 목록이 가치에 따라 처리되는 것으로 예상되는 것으로 보입니다. 파이썬 인수는 참조에 의한 전달 (pass-by-reference)과 비슷하며 목록은 변경 가능하기 때문에 사용자가 요구 한 것과 정확히 일치합니다.

더 익숙해지면 더 분명하고 자연스럽고 편리하게 보일 것입니다.

0

파이썬은 참조로 개체를 전달합니다. 즉, 전달한 실제 객체에 요소를 추가합니다.

+0

그렇다면 ** print cat ** 함수 호출 후에 표시되지 않습니다 ** Bing tiddletiddle bang ** [link] (http://pastebin.com/YrPjb2vt) –

+0

@MikeSila 왜 복사하지 않습니까? 링크에 코드를 붙여 넣어 다른 사람들이 찾아 보지 않게하십시오. – SethMMorton

+0

@MikeSila 코드 링크 안의'cat'은 새로운 변수를 정의하기 때문에, 함수 내부에서만 볼 수 있습니다. '+'연산은 두 개의 매개 변수의 내용을 복사 한 새로운 목록을 만들고 그것을'cat'에 할당합니다. –

0

lsource의 각 요소에 대해 ldest에 있으면 ldest에 추가됩니다. 이러한 이유로 l2의 모든 요소는으로 이동되지 않고 () l1로 복사됩니다.

0

무엇이 ldest입니까? 그것은 당신이 통과 한 것이 전부입니다.이 경우, 당신은 l1을 전달했습니다. ldestl1은 같은 목록입니다. 따라서 개체를 참조 할 때 사용하는 이름은 중요하지 않습니다.

+0

그렇다면 ** print cat ** 함수 호출 후에 표시되지 않습니다. ** Bing tiddletiddle bang ** 코드 [link] (http://pastebin.com/YrPjb2vt) –

+0

왜 그렇게 예상합니까? 당신은'cat'을'part1 + part2'로 지정하고 전달 된 값을 더 이상 참조하지 않습니다. 질문의 코드에서 아무 것도 재 할당하지 않습니다 ('ldest'는 기능). – kindall