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