【问题标题】:Python [:-1] vs removePython [:-1] 与删除
【发布时间】:2017-11-29 01:28:55
【问题描述】:

在 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] 创建了一个新列表,但发生这种情况有什么原因吗?

【问题讨论】:

  • pythontutor.com 上运行它,您将看到参考是如何工作的 - 请参阅可视化中的蓝色箭头。
  • Ned 完美地解释了你需要知道的一切here
  • 已经有答案https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference

标签: python list function reference instance-variables


【解决方案1】:

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

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

感谢@timgeb对视频的评论!

【讨论】:

  • 注意:可以使用变异切片分配来使其工作(它的效率会降低,因为它会涉及制作一个潜在的巨大临时 list 只是为了删除一个项目),通过 @ 987654328@,因为这是重新分配值的范围,而不是重新绑定x
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多