2015-01-30 3 views
0

간단한 예제가 있습니다. 함수 test_list_change은 전달 된 목록을 매개 변수로 변경해야합니다. 그리고이 함수 안에는 서브 루틴 test_list_change_2 같은 목록을 변경해야하는 호출이 있습니다.python : 서브 루틴의 목록 값 변경

문제는, 결과리스트가 될 수있는 이유는 test_list_change_2 서브 루틴

에 의한 변경을 포함하지 않습니다? 여기

의 예이다

def test_list_change(lst): 
    if len(lst) < 3: 
     lst.append("the last one") 
     test_list_change_2(lst) 

def test_list_change_2(lst): 
    lst = ["the very last one"] 

string_list = ["first", "another one"] 
test_list_change(string_list) 
print (string_list) 

출력 :

[ '마지막', '다른 하나'제 ']

+0

그냥'return [ "가장 마지막 것"]'이 함수에서 무엇을하려고했는지와 같지만 코드가 예상 한 것을 수행 할 것이라고 생각하지 않습니다. –

답변

3

list/object 원래 :

def test_list_change(lst): 
    if len(lst) < 3: 
     lst.append("the last one") 
     test_list_change_2(lst) 

def test_list_change_2(lst): 
    lst[:] = ["the very last one"] # changes original list object 

string_list = ["first", "another one"] 
test_list_change(string_list) 
print (string_list) 
['the very last one'] 

당신이 요소 주위를 변경하려면 :

def test_list_change_2(lst): 
    lst[:-1] = ["the very last one"] 
    lst[:] = lst[::-1] 

string_list = ["first", "another one"] 
test_list_change(string_list) 
print (string_list) 
['the last one', 'the very last one'] 

당신은 당신이 좋아하는 어떤 방법으로 목록을 조작 할 수 있지만 실제로 필요 원래 목록 개체를 참조하십시오, 이름을 재 지정하면 다른 개체에 그 이름을 할당하는 lst 변경되지 않습니다. 당신이 "매우 마지막 하나를"단지려고하는 경우

+0

감사합니다, 그것이 내가 원한 목록을 변경하는 방법을 이해하는 데 필요한 것입니다. – Vcitor

+0

걱정하지 마시고, 환영합니다. –

0

넌 필요 ["the very last one"] in test_list_change_2 :

def test_list_change_2(): 
    return ["the very last one"] 
,210

과 첫 번째 함수에 lst에 함수의 결과를 할당 :

def test_list_change(lst): 
    if len(lst) < 3: 
     lst.append("the last one") 
     lst= test_list_change_2() 

참고 실제로 당신이 여기에 기능을 필요 없어요! 당신은 firs 함수에서이 할당을 할 수 있습니다.

+0

에 새로 지정되었습니다. 가치, 그렇지? _lst = [ "마지막 항목"] _ – Vcitor

+0

아니요, 목록에 새 값이 지정되지 않았습니다. 'lst'라는 이름에는 새로운 목록 객체가 할당되었습니다. 건네받은 오브젝트는'lst'라는 이름으로 영향을받지 않습니다. – paidhima

+0

@Vcitor 할당이 변경되었지만 메모리를 낭비하는 등의 작업을 수행 할 필요가 없습니다. – Kasramvd

0

test_list_change2 절차는 lst = ['the very last one']입니다. 그것은 새로운 객체를 로컬 이름 lst에 할당하는 것입니다. 이 절차에 전달 된 목록에는 아무런 영향을 미치지 않습니다.

나는 당신이 성취하려는 것을 확신하지 못합니다. test_list_change2lst에 추가하려면 추가하기 만하면됩니다. 당신은 명확히 할 수 있습니까? 당신은 실제로 변경해야

0

다음 목록에있을 수 있습니다 : 당신은 아마 일을 "참조에 의해 전달"로 파이썬에서 어떻게 작동하는지 혼란스러워했고, 생각

def test_list_change(lst): 
    if len(lst) < 3: 
     lst.append("the last one") 
    lst = test_list_change_2(lst) 

def test_list_change_2(lst): 
    for i in range(len(lst)): 
     lst.pop() 
    lst.append("the very last one") 


string_list = ["first", "another one"] 
test_list_change(string_list) 
print (string_list) 
1

그 이후 참조에 의해 전달되므로 원본 목록이 [ "마지막 항목"]으로 업데이트되어야합니다.

가 그것은 다음과 같은 방식으로 작동

:

1) test_list_change 호출하기 전에이있다 이름 "STRING_LIST"파이썬은 객체를 생성 [ "첫 번째", "다른 하나"]이 할당되는

를 STRING_LIST 할

2) 이제 test_list_change에서 "lst"라는 새 이름이 [ "first", "another one"]과 함께 지정됩니다. 이제 두 개의 이름이 같은 객체로 지정됩니다. 그런 다음 string_list 및 lst가 가리키는 [ 'first', 'another', 'last one']에 추가 및 변경됩니다.

3) test_list_change_2에서 과제를 수행하기 전에 다른 로컬 lst [ "첫 번째", "다른 하나", "마지막 하나"]를 가리키는 이름. 그런 다음 파이썬은 또 하나의 객체 [ '가장 바뀐 것을 마지막으로']를 생성하고 로컬 변수의 값을 대체합니다.

4) STRING_LIST 여전히 [ '제', '다른 하나', '마지막'] 그래서

넣어 다른 방법 '변수는 단지 이름 건네하고 오브젝트 관리 기준에 의해 지적 '.

관련 문제