首页 > 解决方案 > 为什么函数中的列表副本不起作用?

问题描述

b = [0]

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

copyalist(b)
print(b)

输出如下:

[1, 2, 3]
[0]

第一行表示在函数中,b 被设置为 [1, 2, 3];但是,当您从函数中 print(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]

标签: pythonlistfunction

解决方案


在python中,列表作为函数参数仅通过引用传递,即只给出第一个元素的内存地址。在函数内部定义一个 new 时b,您只需更改内部变量所b引用的内存位置,但外部变量b仍指向原始位置。反之亦然,当您这样做时b += [1, 2, 3],您会更改内部引用的单元格内的内容,b并且由于内部和外部b指向相同的单元格,因此它也反映在外部的更改中b


推荐阅读