【问题标题】:Python: List is overwritten. But Why?Python:列表被覆盖。但为什么?
【发布时间】:2014-02-14 14:09:07
【问题描述】:

以下代码:

file_path = 'some_path/data.txt'
exp = loadtxt(file_path)

signal_exp = []
signal_exp.append(exp[1, :])

signal_exp_new = []
signal_exp_new.append(signal_exp[0])

signal_exp_new[0][0:800] = 0.0

将导致 signal_exp 在前 800 个元素以及 signal_exp_new 处被覆盖。我找到了解决方案,但我不明白为什么下一个按预期工作(至少对我来说):

file_path = 'some_path/data.txt'
exp = loadtxt(file_path)

signal_exp = []
signal_exp.append(exp[0, :].tolist())

signal_exp_new = []
signal_exp_new.append(signal_exp[0][:])

for l in range(800):
    signal_exp_new[0][l] = 0.0

谁能给我一个解释,为什么在后一种情况下,原始列表没有被覆盖,但在第一种情况下却被覆盖了?

【问题讨论】:

  • 因为[:] 创建了一个复制完整列表的切片。

标签: python arrays list numpy


【解决方案1】:

NumPy 数组切片和 Python 列表切片的工作方式不同。在 Python 列表上切片会返回列表的浅表副本,而在 NumPy 数组上它只是返回数组项的视图。

来自 NumPy docs:

请注意,数组切片不会复制内部数组数据,而是 还可以生成原始数据的新视图。

因此,在您的第一个解决方案中,您可以使用 .copy 获取数组的副本:

signal_exp_new.append(signal_exp[0].copy())

【讨论】:

    【解决方案2】:

    运算符 [:] 返回序列的切片。切片列表的一部分:创建一个新列表,并将原始列表的部分复制到这个新列表中。

    如果没有 [:],则不会创建新列表。 signal_exp[0] 和 signal_exp_new[0] 指的是同一个列表。

    http://henry.precheur.org/python/copy_list

    【讨论】:

      【解决方案3】:

      在第一个 sn-p 中,您使用的是指针算术。这意味着您不会将 signal_exp[0] 中的条目复制到新列表,但它使用相同的对象并将其“附加”到新变量 - 或者在本例中是列表元素。 [:] 创建列表的副本(但只有一个元素深)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-25
        • 2022-11-30
        • 1970-01-01
        • 2011-09-22
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多