Python函数替换输入变量

时间:2014-01-22 20:29:58

标签: 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'计数表示受体,每次失败时都会为每个受体存储一个列表。 'Unique_recs_in'是所有独特受体位置的列表。

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

编辑:

下面的示例输入

DATA_IN

[['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']]

2 个答案:

答案 0 :(得分:3)

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])

如果列表只包含不可变对象,那么只有浅拷贝就足够了:

recs = unique_recs_in[:]

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

答案 1 :(得分:2)

您可能希望将recs存储在unique_recs_in副本中,以便不会被修改。试试这个:

recs = [l[:] for l in unique_recs_in] # although Ashwini `deepcopy` is more elegant

通过将列表分配给另一个列表l1=l2,您只需在它们之间建立和别名(即:两个变量引用内存中的相同列表),因此修改一个将修改另一个(因为它们是相同的) )。

希望这有帮助!