【问题标题】:List into a tuple - modifying the list reflects in tuple but emptying the list does not change in tuple列表成一个元组 - 修改列表反映在元组中,但清空列表不会在元组中改变
【发布时间】:2016-12-15 19:33:33
【问题描述】:

为什么在下面的示例中,当我设置 names = [] 时,元组 t 没有改变,但是当我向 names 列表添加新值时,改变会反映出来?

看起来tuple 最初是在引用该列表,因此任何更改都会反映在元组对象中,但清空它看起来像是创建了一个新副本。

>>> names = ['Mark','Hary']
>>> t = (names,'Lauri')
>>> t
(['Mark', 'Hary'], 'Lauri')
>>> names.append('Donna')
>>> names
['Mark', 'Hary', 'Donna']
>>> t
(['Mark', 'Hary', 'Donna'], 'Lauri')
>>> names = []
>>> names
[]
>>> t
(['Mark', 'Hary', 'Donna'], 'Lauri')

【问题讨论】:

  • 通过[pythontutor]运行它(pythontutor.com/…这对于可视化这类事情非常有用。
  • 该死,为什么我永远无法正确显示 pythontutor 链接... :(

标签: python list python-3.x tuples


【解决方案1】:

names.append('Donna') 将影响元组,因为元组与names 一样持有对列表对象的相同引用,并且您正在对其进行变异 (list.append)。

names = [] 是一个不会改变引用的 assignment 语句,它重新绑定名称 names 到一个新对象(在这种情况下是一个空列表)。这样的重新绑定不会影响元组中已经存在的引用。

您可以删除 in-place(即通过names 修改列表对象引用)并反映该更改。这可以通过多种方式完成,您可以使用names.clear()del names[:] 甚至names[:] = []

del names[:]

在此操作之后,t 内部的引用会反映此更改:

print(t)
([], 'Lauri')

【讨论】:

  • 好吧有道理,但是当我这样做del names 时,它不会从tuple 中删除列表。 del namesdel names[:] 有什么区别?
  • @VBJ del names[:] 删除列表的内容del names 删除名称names 引用列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多