2011-05-31 122 views
0

我剛開始學習Python的我變得有點糊塗看到下面的程序後輸出:Python程序令人驚訝的輸出

#!/usr/bin/python 
# Function definition is here 
def changeme(mylist): 
    "This changes a passed list into this function" 
    mylist = [1,2,3,4]; # This would assig new reference in mylist 
    print "Values inside the function: ", mylist 
    return 

# Now you can call changeme function 
mylist = [10,20,30]; 
changeme(mylist); 

print "Values outside the function: ", mylist 

值在函數內部:在函數外[1, 2, 3, 4]
值:[10, 20, 30]

爲什麼值超出函數:[10, 20, 30],而不是[1, 2, 3, 4],因爲我們通過引用將參數傳遞給函數?

+2

沒有看到。再試一次。 – 2011-05-31 07:27:55

+2

我得到了'[10,20,30,[1,2,3,4]]'。 – icktoofay 2011-05-31 07:28:16

+0

我現在已經更新了正確的代碼!這是給我的令人驚訝的O/P – 2011-05-31 07:34:55

回答

3

通過分配一個值,您正在定義一個新的列表,而不是更新舊的列表。

您可以使用id()函數對它們進行檢查。

+0

要更新傳遞的列表,您需要使用「破壞性」操作來更改列表:.append,.extend,slice assignment。 – ThomasH 2011-05-31 08:00:51

4

工作對我來說,有適當的縮進:

def changeme(mylist): 
    mylist.append([1, 2, 3, 4]) 
    print "Values inside the function: ", mylist 

mylist = [10, 20, 30] 
changeme(mylist) 
print "Values outside the function: ", mylist 

輸出:

Values inside the function: [10, 20, 30, [1, 2, 3, 4]] 
Values outside the function: [10, 20, 30, [1, 2, 3, 4]] 

注意altough分號在該行的末尾允許的,它們的使用是沮喪,因爲他們所服務沒有目的,並使代碼看起來不那麼幹淨。此外,你可能尋找MYLIST的extend方法,而不是append

>>> mylist = [10, 20, 30] 
>>> mylist.extend([1, 2, 3, 4]) 
>>> mylist 
[10, 20, 30, 1, 2, 3, 4] 

回覆:更新

在你放棄你的參考MYLIST更新changeme功能,取代它並引用您剛剛創建的新列表。如果您保留對舊列表的引用,它將保持不變。這應該說明這一點:

def changeme(mylist): 
    myref = mylist 
    mylist = [1, 2, 3, 4] 
    print "myref: ", myref 
    print "mylist: ", mylist 

輸出:

myref: [10, 20, 30] 
mylist: [1, 2, 3, 4] 

達到你想要的結果,您可以使用python slice notation

def changeme(mylist): 
    mylist[:] = [1,2,3,4] 
+0

@Thanks Lazyr你的解釋,但我想知道這是否是在C語言的情況下,什麼O/P你期望??是它表現與其在此表現的方式相同 – 2011-05-31 07:50:16

+0

對不起,我不太明白你在問什麼。你可以嘗試重新措辭嗎? – 2011-05-31 07:56:32

+0

@Lazyr在C語言中,如果我們將數組名稱作爲函數參數傳遞,那麼無論我們在該數組上執行什麼操作,都會反映到原始數組中,這在Python中看起來不相同。 – 2011-05-31 08:10:01

1

mylist在函數內部是一個局部變量。如果您將新值綁定到局部變量,那麼您只能更改局部變量的綁定。這不會影響碰巧綁定到同一個對象的任何其他變量。

如果您已經對對象本身進行了變異,例如通過追加到列表中,對於使用同一對象的任何內容都是可見的。

相關問題