【问题标题】:Python: Inserting sublist into main list is replacing all the existing sublistPython:将子列表插入主列表正在替换所有现有的子列表
【发布时间】:2020-05-19 18:05:57
【问题描述】:

我有以下 python 代码,其中将子列表 tmp[] 插入到主列表 lis[] 中。每次,我将子列表添加到主列表中,主列表中的所有列表元素都被子列表替换

tmp = [0]  
lis = []
tmp[0] = 0
lis.insert(0,tmp)
print lis
tmp[0] = 1
lis.insert(1,tmp)
print lis

输出:

[[0]]
[[1], [1]]

我应该做些什么改变才能得到如下所示的输出

[[0]]
[[0], [1]]

【问题讨论】:

  • 你插入的是同一个变量 tmp 所以引用是一样的,使用不同的变量

标签: python list printing insert logic


【解决方案1】:

另一种方法:

lis = []
tmp = [0]
lis.insert(0,tmp)
print(lis)
tmp = [1]
lis.insert(1,tmp)
print(lis)

输出:

[[0]]
[[0], [1]]

【讨论】:

    【解决方案2】:

    技术问题是列表是可变的,这意味着您实际上插入了两次相同的对象,而不是插入两个不同的对象。 tmp 的更改反映在您看到它的两个地方,lis 的第 0 和第 1 个条目。在不创建新变量或覆盖旧名称的情况下,没有一种很好的解决方法。

    >>> tmp = [0]  
    >>> lis = []
    >>> tmp[0] = 0
    >>> lis.insert(0,tmp)
    >>> print(lis)
    [[0]]
    
    >>> tmp2 = [1]
    >>> lis.insert(1,tmp2)
    >>> print(lis)
    [[0], [1]]
    

    【讨论】:

      【解决方案3】:

      在 Python 中出现这种行为是因为 Python 中的 listsmutable

      根据 Python 文档:

      可变对象可以改变它们的值,但保留它们的 id()。

      因此,基本上当您将列表 tmp 插入索引 0 处的 lis 时,tmp is lis[0] 的计算结果为 Trueid(tmp) == id(lis[0]) 的计算结果也为 True。然后,当您稍后将列表 tmp 的索引 0 处的元素从 0 更改为 1 时,因为可变对象“更改它们的值但保留它们的 id()”,tmp is lis[0]id(tmp) == id(lis[0]) 仍然评估为 True .因此,将tmp[0] 插入lis[1] 会导致lis[0]lis[1] 处的元素重复。

      解决方案

      为了缓解这种情况而不是使用列表,我们可以使用不可变对象(正如您所期望的那样,不可变对象会更改其值但会丢失其 id()),例如 tuples。但是当然元组也有限制,因为元组是不可变的,我们不能在初始化后修改它们的内容(通过插入、删除等)。 Python 中的元组与列表的表示方式相同,只是我们使用() 而不是使用[](或方括号)来初始化它们。

      例如您的示例问题的解决方案(使用元组)是:

      tmp = (0,)  # In order to initialize a tuple a comma is always required after the first element
      lis = []
      lis.insert(0, tmp)
      print(lis)
      tmp = (1,)  # We cannot modify tuples therefore we must create a new one.
      lis.insert(1, tmp)
      print(lis)
      

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2017-08-10
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 2022-07-03
        • 1970-01-01
        • 2011-12-07
        • 2019-01-04
        相关资源
        最近更新 更多