2014-02-11 69 views
4
>>> c=[1,100,3] 
>>>def nullity (lst): 
    lst=[] 
>>>nullity (c) 
>>>c 
[1,100,3] 

爲什麼c不返回[]?是不是nullity(c)的意思是c=lst所以你現在都指向[]?python-爲什麼列表不能修改?

+1

我是唯一一個爲什麼認爲提問者還沒有完成他們的作業?它被問了很多次,爲什麼又是另一個? – erb

+1

我認爲這個問題已被多次提出,但在做搜索查詢時很難制定。 –

回答

2

您正在將本地變量lst重新分配到新的list。要清空現有列表,您需要刪除其所有成員:

del lst[:] 
1

Python不允許您替換參數。你只是在改變函數中的「lst」,但它不影響調用代碼。

而是通過清除其更改列表本身:

def nullity (lst): 
    lst.clear() # With Python >= 3.3 
5

Python有傳遞值語義,這意味着當你傳遞參數給一個函數,它接收到一個副本對象的引用,但而不是對象本身。所以,如果你重新分配一個函數參數給別的東西(和你一樣),賦值爲本地的函數,原來的對象「外部」函數保持不變。一個完全不同的情況發生,如果你想改變什麼對象:

def test(a): 
    a[0] = 0 

lst = [1, 2, 3] 
test(lst) 
lst 
=> [0, 2, 3] 

在上面的代碼清單中的元素髮生了變化,這是因爲這兩個lsta都指向完全相同的對象。現在回到原來的問題 - 請注意,在Python 3.2及以下版本中沒有clear()方法(它是在Python 3.3中添加的),here是一個相關的討論。但是你可以達到相同的效果做到這一點,它會在Python 2.x和3.x工作:

def nullity(lst): 
    del lst[:] 
+0

雖然OP使用[tag:python-3.x],但有可能存在'.clear()'方法(在Python 3.3中實現) –

+0

@MaximeLorant這對我來說是新聞!公平,我更新了我的答案 –

+1

沒問題,你現在應該得到upvote :) –

1

現在讓我們使用id()功能

In [14]: c=[1,2,3] 

In [15]: def nullity (lst): 
    ...:  print id(lst) 
    ...:  lst=[] 
    ...:  print id(lst) 
    ...:  

In [16]: id(c) 
Out[16]: 33590520 

In [17]: nullity(c) 
33590520 
33591024 

在做重新分配一個新的創建的本地對象與調用該函數時使用的對象不同。

相關問題