[英]python function that modifies parameters
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 ++截然不同。
謝謝
但是,為什么這個人忽略了回報? 無論有無回報都可以。 為什么? 這與C ++截然不同。
一點也不-在所有意圖和目的上都與C ++相同! 只需在C ++版本中使一個void add
並通過引用將其參數a
傳遞給std::vector<int>
,以達到所有目的和目的,這就是Python的add
功能,從C ++術語中可以看出。
用Python術語來說,當一個函數“掉到頭”時,與執行該函數完全相同 ,此時將return None
。 在這種情況下(當函數總是以“結束”結束時),這是更好的樣式,以避免冗余的return None
語句(不要在這種冗余的裝飾中浪費像素和屏幕空間)。
add()
更改a
而不是重新綁定它,因此更改將顯示在原始對象中。
一切都是通過python中的引用傳遞的,但是整數,字符串等是不可變的,因此當您對其進行更改時,會創建一個綁定到局部變量的新變量,因此傳遞給函數的變量不會更改。 列表和字典是可變的-因此,如果更改它們,則不會創建新對象,因此,更改也會影響調用者范圍內的變量。
請考慮以下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
保持不變,因為它是按值傳遞的。 但是,將vector
傳遞給add_ref()
會導致原始vector
內的值發生更改,因為它是通過引用傳遞的。
在Python中, 所有內容均通過引用傳遞。 但是,許多內置類型( str
, tuple
, int
, float
等)是不可變的。 這意味着您對這些類型執行的任何操作都將導致新變量在當前范圍內與新值綁定。 對於可變類型( list
, dict
等),最終得到的結果與C ++中通過引用傳遞參數的結果完全相同 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.