2017-01-10 37 views
0

我想定義一個函數列表 x是它的輸入變量,假設我想在輸入變量(x)的值在執行該函數後不變,我認爲我應該做的是分配將輸入變量(x)的值賦值給另一個變量(y),並對該新變量(y)進行計算,並在結尾處返回y,保持輸入變量x不變(這是代碼中的第二個函數)。python如何在函數中更改輸入變量的值,即使它被分配給另一個變量?

實現該代碼給出了與未添加新變量y並在y上執行計算的結果相同的結果。 x的值被改變。 (它給出了與第一個函數相同的結果)

我發現通過構造一個空列表y來間接地將x的值分配給y,然後將y的條目逐個添加到y然後執行操作在y上解決了這個問題(如代碼中的第三個函數)。

我的問題是,爲什麼python做到這一點?當我將x的值賦給y並對y做了x保持不變的情況下,情況不應該如此嗎?我錯過了什麼?

def li(X): 
    X.append(1) 
    return(X) 

def le(X): 
    Y=X 
    Y.append(1) 
    return(Y) 

def lo(X): 
    Y=[] 
    for i in range(X): 
      Y.append(X[i]) 
    Y.append(1) 
    return(X) 

回答

1

我缺少什麼?

你問題在於Python變量的工作方式。您看到,當您將x列表分配給變量y時,您不會創建拷貝x。而是您創建一個參考到列表x。這意味着當任一變量變化時(xy),它們都會發生變化,因爲它們都指向完全相同的列表。

您需要明確告訴Python創建x副本,給變量y。這樣一來,既變量將是彼此獨立的:

>>> x = [1, 2, 3] 
>>> 
>>> def change(x): 
...  y = x[:] # create a copy of x and not a reference 
...  y.append(4) # change the copy 
...  return y 
... 
>>> x # before change 
[1, 2, 3] 
>>> change(x) 
[1, 2, 3, 4] 
>>> x # after change 
[1, 2, 3] 
>>> 
+0

好的技巧,非常感謝你:) –

+0

@FawzyHegab非常感激福吉。 –

相關問題