簡體   English   中英

python-為什么列表沒有修改?

[英]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]

在上面的代碼片段中,列表的元素已更改,這是因為lsta都指向完全相同的對象。 現在回到最初的問題 - 注意在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM