2

我对此感到困惑。

假设我有一个名为 everythird 的函数,它接受一个列表作为参数,并返回每第三个元素。

def everythird(l):
    return l[0::3]

如果我输入 everythird([1,2,3,4,5,6,7]) 并返回 [1, 4, 7]。这被认为是一个新列表、修改后的列表,还是两者都不是?

方法也会修改或创建新列表吗?拼接呢?

4

1 回答 1

3

切片创建浅拷贝。这是一个不同的列表,但具有相同的元素。这意味着您可以附加到它,或者通过索引重置元素而不影响原始元素,但是如果您改变一个元素,效果将在原始元素中看到。

由于您的元素是不可变的,因此您不会注意到这一点,但请考虑以下事项:

>>> def everythird(l):
        return l[0::3]

>>> x = [[1], [2], [3]]
>>> y = everythird(x)
>>> y[0].append(1)
>>> x
[[1, 1], [2], [3]]

拥有完全不同的列表的唯一方法是通过copy.deepcopy

方法也会修改或创建新列表吗?拼接呢?

list方法通常像.append实例本身一样就地变化,但 Python 3 例外,list.copy它等同于seq[:]or list(seq)

于 2013-06-16T01:59:28.153 回答