您如何知道是创建了新列表还是仅修改了新列表?

时间:2013-06-16 01:56:39

标签: python list python-3.x

我对此很困惑。

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

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

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

还有方法修改或创建新列表吗?拼接怎么样?

1 个答案:

答案 0 :(得分: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[:]list(seq)