2010-08-19 4 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 не имеет возврата. Я читал, что изменения доступны только для изменяемых объектов, таких как список. Но почему человек отказался от возвращения? Либо с возвратом, либо без него. Зачем? Это отличается от C++.Функция python, которая изменяет параметры

Благодаря

ответ

7

Но почему человек опустил ? Либо с возвратом или без него в порядке. Зачем? Это так отличается от C++.

Совсем нет - это идентично C++ для всех целей и целей! Просто сделайте в версии C++ void add и передайте его аргумент a, скажем std::vector<int>, по ссылке - во всех смыслах и целях это то, что делает этот Python add, видимый в терминах C++.

В терминах Python, когда функция «падает с конца», это точно так же, как если бы он выполнял return None в этом пункте. Стиль лучше в таких случаях (когда функция всегда заканчивается «падением конца»), чтобы избежать избыточного вывода return None (не тратьте впустую пикселы и пространство экрана в избыточном орнаменте такого типа).

1

add() мутирует a вместо подмены, поэтому изменение отображается в исходном объекте.

1

Все передано по ссылке в python, но целые числа, строки и т. Д. Неизменяемы, поэтому при его изменении вы создаете новый, привязанный к локальной переменной, поэтому переменная, переданная функции, не изменяется. Списки и 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; 
} 

программы выхода:

After add_val 
1 2 3 
After add_ref 
4 5 6 

vector пропусканием в add_val() результаты в исходном vector остается неизменным, так как она передается по значению. Однако передача в add_ref() приводит к изменению значений внутри оригинала vector, поскольку он передается по ссылке.

В Python все передается по ссылке. Однако многие встроенные типы (str, tuple, int, float и т. Д.) Являются неизменными. Это означает, что любая операция, выполняемая этими типами, приводит к тому, что новая переменная привязана в текущей области с новым значением. Для изменяемых типов (list, dict и т. Д.) Вы получаете ровно тот же результат, что и передача параметра по ссылке в C++.

Смежные вопросы