[英]python- why the list doesn't modified?
>>> c=[1,100,3]
>>>def nullity (lst):
lst=[]
>>>nullity (c)
>>>c
[1,100,3]
為什么c不返回[]? 是不是nullity(c)
意味着c=lst
所以你的兩個現在指向[]?
Python具有按值傳遞的語義,這意味着當您將參數傳遞給函數時,它會接收對象引用的副本,但不會接收對象本身。 因此,如果您將函數參數重新分配給其他東西(就像您所做的那樣),則賦值對於函數是本地的 ,函數“外部”的原始對象保持不變。 如果您更改對象內的某些內容 ,則會發生完全不同的情況:
def test(a):
a[0] = 0
lst = [1, 2, 3]
test(lst)
lst
=> [0, 2, 3]
在上面的代碼片段中,列表的元素已更改,這是因為lst
和a
都指向完全相同的對象。 現在回到最初的問題 - 注意在Python 3.2及以下版本中沒有clear()
方法(它在Python 3.3中添加), 這里是一個相關的討論。 但是你可以做同樣的效果,它可以在Python 2.x和3.x中使用:
def nullity(lst):
del lst[:]
您將局部變量lst
重新分配給新的空list
。 要清空現有列表,您需要刪除其所有成員:
del lst[:]
Python不允許您替換參數。 您只是更改函數中“lst”所指的內容,但它不會影響調用代碼。
而是通過清除它來更改列表本身:
def nullity (lst):
lst.clear() # With Python >= 3.3
讓我們使用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
在進行重新分配時,會創建一個新的本地對象,該對象與調用該函數時使用的對象不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.