2012-03-19 95 views
3

人,蟒通列表作爲函數參數

下面的代碼的結果[] 爲什麼不能[ '0', '1', '2']?如果我想讓psswd等於函數foo中的數字,我該怎麼辦?

number = ['0','1','2'] 
def foo(psswd): 
    psswd = number[:] 

if __name__ == '__main__': 
    psswd = [] 
    foo(psswd) 
    print psswd 

回答

1

您的代碼:

number = ['0','1','2'] 
def foo(psswd): 
    psswd = number[:] 

if __name__ == '__main__': 
    psswd = [] 
    foo(psswd) 
    print psswd 

psswd = number[:]重新綁定本地變量psswd一個新的列表。

也就是說,當你做foo(psswd)時,函數foo被調用,並且它內部的局部變量passwd被創建,它指向同名的全局列表。

當你psswd = <something>foo功能,創建此<something> /得到和本地名稱psswd由指向它。全局變量psswd仍指向舊值。

如果要更改對象本身,而不是本地名稱,則必須使用此對象的方法。 psswd[:] = <smething>實際上調用psswd.__setitem__方法,因此修改了由本地名稱psswd引用的對象。

12

您需要發生變異,而不是重新綁定,與slice-assigning

psswd[:] = number[:] 
6
number = ['0','1','2'] 
def foo(psswd): 
    psswd[:] = number # swap the slice around here 

if __name__ == '__main__': 
    psswd = [] 
    foo(psswd) 
    print psswd