2010-08-19 6 views
0
def add(a,b): 
    for i in range(len(a)): 
     a[i] = a[i] + b 

def main(): 
    amounts = [100,200] 
    rate = 1 
    add(amounts,rate) 
    print amounts 

main() 

함수 add에는 복귀가 없습니다. 변경 사항은 list와 같은 변경 가능한 객체에서만 사용 가능하다는 것을 읽었습니다. 그런데 왜 그 사람은 그 수익을 생략 했습니까? 반환 유무와 상관없이 괜찮습니다. 왜? 이것은 C++과 매우 다릅니다.매개 변수를 수정하는 파이썬 함수

감사

답변

7

하지만 왜 그 사람은 신고를 생략 했습니까? 반환 여부와 상관없이 은 문제가 없습니다. 왜? 이것은 C++의 과 매우 다릅니다.

전혀 아닙니다. 모든 의도와 목적에 따라 C++과 동일합니다! C++ 버전에서 void add을 만들고 그 인수를 a, 예를 들어 std::vector<int>으로 전달하십시오. 모든 의도와 목적을 위해이 코드는 C++ 용어로 보았을 때 add입니다.

파이썬 용어에서 함수가 "끝에서 떨어지면"정확히 일 때 그 시점에서 return None을 실행 한 것과 같습니다. 그러한 경우에 더 좋은 스타일입니다 (항상은 "끝에서 떨어지다"로 끝납니다). 중복 된 return None 문을 피하십시오 (이 종류의 중복 장식에서 픽셀과 화면 공간을 낭비하지 마십시오).

1

add() 변이 a 대신에 변화가 원래의 객체에 표시하므로, 그것을 리 바인딩의.

1

모든 것이 파이썬에서 참조로 전달되지만 정수, 문자열 등은 변경할 수 없으므로 변경할 때 로컬 변수에 바인드 된 새 변수를 작성하므로 함수에 전달 된 변수는 변경되지 않습니다. 그러나 목록과 dicts는 변경 가능합니다. 따라서 변경할 경우 새 개체가 만들어지지 않으므로이 변경 사항은 호출자 범위의 변수에도 영향을줍니다.

0

는 다음의 C++ 프로그램을 고려

#include <vector> 
#include <iostream> 

void add_val(std::vector<int> addTo, int addThis) 
{ 
    for(std::vector<int>::iterator it = addTo.begin(); it!=addTo.end(); ++it) 
    { 
     *it += addThis; 
    } 
} 

void add_ref(std::vector<int>& addTo, int addThis) 
{ 
    for(std::vector<int>::iterator it = addTo.begin(); it!=addTo.end(); ++it) 
    { 
     *it += addThis; 
    } 
} 

int main() 
{ 
    std::vector<int> myVector; 

    myVector.push_back(1); 
    myVector.push_back(2); 
    myVector.push_back(3); 

    add_val(myVector, 3); 

    std::cout<<"After add_val"<<std::endl; 
    for (std::vector<int>::iterator it = myVector.begin(); it!=myVector.end(); ++it) 
    { 
     std::cout<<*it<<" "; 
    } 

    std::cout<<std::endl; 

    add_ref(myVector, 3); 

    std::cout<<"After add_ref"<<std::endl; 
    for (std::vector<int>::iterator it = myVector.begin(); it!=myVector.end(); ++it) 
    { 
     std::cout<<*it<<" "; 
    } 
    std::cout<<std::endl; 

    return 0; 
} 

프로그램 출력 : 그대로 남아 일본어 vectorvectoradd_val()에게 결과를 전달

After add_val 
1 2 3 
After add_ref 
4 5 6 

을이 값으로 전달되기 때문이다. 그러나 vectoradd_ref()으로 전달하면 참조로 전달 된 원래 vector의 값이 변경됩니다.

파이썬 모두은 참조로 전달됩니다. 그러나 많은 내장 유형 (str, tuple, int, float 등)은 변경할 수 없습니다. 즉, 이러한 유형에 대해 수행하는 모든 연산은 새 변수가 현재 범위에서 새 값에 바인딩되도록합니다. 변경 가능한 유형 (list, dict 등)의 경우 으로 정확히이되고 C++에서 참조로 매개 변수를 전달한 것과 같은 결과가됩니다.

관련 문제