簡體   English   中英

為什么函數中的列表副本不起作用?

[英]Why doesn't the copy of a list in a function work?

b = [0]

def copyalist(b):
    b = [1, 2, 3]
    print(b)

copyalist(b)
print(b)

產出如下:

[1, 2, 3]
[0]

第一行表示在函數中,b設置為[1,2,3]; 但是,當您從函數中打印(b)時,第二個輸出表示b仍為[0]。

我不明白,為什么外部b沒有改變?

我也試過b = copy.deepcopy([1,2,3]),輸出是一樣的。

但是,以下代碼運行良好:

b = [0]

def copyalist(b):
    b += [1, 2, 3]
    print(b)

copyalist(b)
print(b)

產出如下:

[0, 1, 2, 3]
[0, 1, 2, 3]

在python中,列表僅作為函數參數通過引用傳遞,即,僅給出第一個元素的內存地址。 在函數內部定義新的b ,只需更改內部變量b引用的內存中的位置,但外部b仍然指向原始位置。 反之亦然,當你做b += [1, 2, 3] ,你改變內部b引用的單元格內的內容,並且由於內部和外部b指向相同的單元格,它反映了外部的變化b也是。

b = copyalist(b) 

並在函數中返回b

def copyalist(b):
    b = [1, 2, 3]
    return(b)

當您在函數中定義某些內容時,它僅在該函數內部使用。

這段代碼:

def copyalist(b):
    b = [1, 2, 3]
    print(b)

只是意味着將變量名b重新映射到新列表,而不是修改原始b 如果您要修改原始列表,則必須明確告訴Python替換實際內容。 要做的是:

def copyalist(b):
    b[:] = [1, 2, 3]
    print(b)

這是由於全局和局部變量的差異。 您可以向函數添加全局以獲得所需的結果。

b = [0]

def copyalist():
    global b
    b = [1, 2, 3]
    print(b)

copyalist()
print(b)

OUTPUT

[1, 2, 3]
[1, 2, 3]

這里有一個更深入的總結

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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