python - 为什么函数中的列表副本不起作用?
问题描述
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]
解决方案
在python中,列表作为函数参数仅通过引用传递,即只给出第一个元素的内存地址。在函数内部定义一个 new 时b
,您只需更改内部变量所b
引用的内存位置,但外部变量b
仍指向原始位置。反之亦然,当您这样做时b += [1, 2, 3]
,您会更改内部引用的单元格内的内容,b
并且由于内部和外部b
指向相同的单元格,因此它也反映在外部的更改中b
。
推荐阅读
- php - 用于循环状态 [0] 的嵌套 Json php 问题
- swift - 使用函数类型的变量创建选择器
- php - PHP get_headers() result distinguish
- postgresql - 一次聚合 k 行的所有组合
- powershell - 如何按使用 powershell 修改的日期对不同目录中的文件进行排序?
- r - 在 R 中读取 dat 文件
- c# - 翻译 Unity 计量单位?
- python - 如何将 Python 中的分类变量转换为 R 中的因子变量?(网状)
- ruby-on-rails - NameError: uninitialized constant (rails) - Can't 'see' Models
- mercurial - Mercurial 中是否有一个用于拉动然后更新的术语?