Python函数替换输入变量

标签 python list function

我在 python 中发现了一些我无法解释的奇怪行为。我编写了以下函数:

def process_data(data_in, unique_recs_in):
    recs = unique_recs_in
    for x, dat in enumerate(recs):
        recs[x].append(data_in.count(dat))
    return recs

其中 data_in 和 unique_recs_in 是列表的列表。 'data_in' counts 表示受体,每次不符合标准时都会为每个受体存储一个列表。 'Unique_recs_in' 是所有唯一受体位置的列表。

我无法弄清楚的是,当我调用此函数时,我的输出“recs”会正确返回。但是,当我运行该函数时,“unique_recs_in”会发生变化,并且与“recs”相同。我对代码进行了错误测试,可以确认是在这个函数中发生了这种情况。有人有什么想法吗?

编辑:下面的示例输入

数据输入

[['631507.40000', '4833767.20000', '60.00'], ['631507.40000', '4833767.20000', '63.00'], ['631507.40000', '4833767.20000', '66.00']]

unique_recs_in:

[['631552.90000', '4833781.00000', '24.00'], ['631569.50000', '4833798.80000', '48.00'], ['631589.20000', '4833745.50000', '12.00']]

最佳答案

recs = unique_recs_in 只是创建一个对列表对象的新引用,要获得列表列表的全新副本,请使用 copy.deepcopy

>>> lis = [[1, 2], [3, 4]]
>>> a = lis
>>> a.append(4)     #changes both `a` and `lis`
>>> a, lis
([[1, 2], [3, 4], 4], [[1, 2], [3, 4], 4])

对于列表的列表,即使是浅拷贝也不够:

>>> a = lis[:]
>>> a[0].append(100) #Inner lists are still same object, just the outer list has changed.
>>> a, lis
([[1, 2, 100], [3, 4]], [[1, 2, 100], [3, 4]])

copy.deepcopy 返回一个全新的副本:

>>> import copy
>>> a = copy.deepcopy(lis) 
>>> lis
[[1, 2, 100], [3, 4], 4]
>>> a.append(999)
>>> a, lis
([[1, 2, 100], [3, 4], 4, 999], [[1, 2, 100], [3, 4], 4])
>>> a[0].append(1000)
>>> a, lis
([[1, 2, 100, 1000], [3, 4], 4, 999], [[1, 2, 100], [3, 4], 4])

如果列表仅包含不可变对象(immutable对象),则仅浅拷贝就足够了:

recs = unique_recs_in[:]

您可能会发现这也有帮助:Python list([]) and []

关于Python函数替换输入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293323/

相关文章:

__le__、__ge__ 的 python 错误?

c - 在c中复制单个列表的节点

python - 如何将 aws cdk 自定义构造库托管为 API

python - 我的 plotly 子图的第一个图占据了整个图形(2x4 轴网格)

C# 列表删除不区分大小写

python - 基于公共(public)元组元素组合元组列表

javascript - 在任意 JS 函数上设置事件处理程序?

javascript - 如何使 switch 语句一遍又一遍地运行而不会卡在负载上?

ios - 如何在 swift 3 的其他功能中使用服务器响应和数据

python - 没有这么多变量,我如何计算这个数字?