【问题标题】:What does "Tuples can store the elements directly and lists store a pointer to the elements" mean?“元组可以直接存储元素,列表存储指向元素的指针”是什么意思?
【发布时间】:2020-01-14 21:47:15
【问题描述】:

我对从与此question 相关的答案中得到的这个陈述感到困惑:

“因此元组可以将元素直接存储在结构中,另一方面列表需要一个间接层(它存储一个指向元素的指针)。这个间接层是一个指针,在 64 位系统上是 64 位,因此8 字节。”

  1. 列表和元组之间真的有这种区别吗?

  2. “将元素直接存储在结构内”到底是什么意思?

【问题讨论】:

  • 您误读了答案。列表有一个指向指针数组的指针,而元组内部包含指针数组。
  • 是的,现在我明白其中的区别了!

标签: python list pointers tuples


【解决方案1】:

Python 中的一切都是对象。但是容器不直接存储对象,它们存储对对象的引用——这是一个 C 指针。

元组可以直接存储这些指针,因为它是不可变的,它永远不会改变它的大小。元组对象将被构建得足够大以包含内部数组中的所有指针。

另一方面,列表可以随时添加或删除元素。指针数组不能自包含,必须间接访问,以便根据需要重新分配。

【讨论】:

    【解决方案2】:
    1. 是的!
    2. 将元素直接存储在结构中意味着:

      对对象的引用直接合并到元组对象中。在列表中,这个引用是通过一个指向它的指针来合并的,即使引用中的值发生变化,这个指针也不会改变。

    例子:

    # immutable integer 4
    x = 4
    #id() returns the memory address of the object.
    print(x, id(x))
    x = x+1
    print(x, id(x))
    
    lst = [[1],[2]]
    print(lst, id(lst))
    lst[0].append(2)
    print(lst, id(lst))
    
    #Output
    4 139694701925760
    5 139694701925792
    [[1], [2]] 139694626834704
    [[1, 2], [2]] 139694626834704
    

    在这里你可以看到x的引用发生了变化,因为添加后它引用了全新的地址,而列表中的引用(指向引用的指针)在操作后保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多