Python [:-1] 与删除

Python [:-1] vs remove

在python中写递归函数时,我注意到一个有趣的现象。 .append 将更改输入变量,但 = 会在函数中创建一个私有实例变量。例如,使用 equals 不会影响 a,

>>> def f(x):
        x=x[:-1]
>>> a=[1, 2, 3]
>>> f(a)
>>> a
[1, 2, 3]

使用附加更改时 a.

>>> def g(x):
        x.remove(3)

>>> g(a)
>>> a
[1, 2]
>>> 

我认为这是因为 .remove 编辑了引用,而 [:-1] 创建了一个新列表,但这是有原因的吗?

来自Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015

x.append("something")x.remove("something")mutate这样的函数,改变它们的值。但是,使用 x=x+["something"]x=x[:-1] 重新绑定 一个引用,并创建一个变量现在指向的新值。

感谢@timgeb对视频的评论!

在这段代码中:.appendx的一个函数,所以x是同一个实例;但是,x = [1]x 将创建一个新实例。试试这个:

def f(x):
    print(x, id(x))
    x = [1]
    print(x, id(x))