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对视频的评论!
在这段代码中:.append
是x的一个函数,所以x是同一个实例;但是,x = [1]
,x 将创建一个新实例。试试这个:
def f(x):
print(x, id(x))
x = [1]
print(x, id(x))
在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对视频的评论!
在这段代码中:.append
是x的一个函数,所以x是同一个实例;但是,x = [1]
,x 将创建一个新实例。试试这个:
def f(x):
print(x, id(x))
x = [1]
print(x, id(x))