【问题标题】:Issue with pop() and append() [duplicate]pop() 和 append() 的问题 [重复]
【发布时间】:2017-06-30 19:16:52
【问题描述】:

任何帮助将不胜感激!!!

res = []
s = [1,2,3,4,5,6]
s.pop() 
res.append(s)
print res
s.pop()                                                                                  
res.append(s)
print res

上面的python代码给出了以下结果

[[1, 2, 3, 4, 5]]
[[1, 2, 3, 4], [1, 2, 3, 4]]

我不明白为什么 pop on s 会影响 res。我的意思是打印结果应该是

[[1,2,3,4,5]]
[[1,2,3,4,5],[1,2,3,4]]

【问题讨论】:

  • 您正在使用相同的列表。您已将s 添加到res 两次,但它仍然是同一个列表
  • 在将s添加到res之前,我会弹出s中的最后一项。所以 res 里面的两个项目应该是不一样的吧?

标签: python list append


【解决方案1】:

Python 中的每个值都是对象的引用(指针)。 赋值总是复制值(这是一个指针);两个这样的 因此指针可以指向同一个对象。

要获得所需的结果,您需要复制初始列表:

res = []
s = [1,2,3,4,5,6]
s.pop()
res.append(s[:])
print(res)
s.pop()
res.append(s[:])
print(res)

同样可以使用list.copy()函数:

...
res.append(s.copy())
...

输出:

[[1, 2, 3, 4, 5]]
[[1, 2, 3, 4, 5], [1, 2, 3, 4]]

【讨论】:

  • 谢谢,@RomanPerekhrest。现在我明白了。
【解决方案2】:

这没关系 - 因为 res 将持有与 s 相同的引用(对同一个对象 - 在本例中为数组)。

要解决这个问题,请使用:

res = []
s = [1,2,3,4,5,6]
s.pop()
res.append(list(s))
print res
s.pop()
res.append(list(s))
print res

也看看:

How to clone or copy a list?

python: Appending a dictionary to a list - I see a pointer like behavior

【讨论】:

  • 感谢参考链接。@Dozon Higgs
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多