【问题标题】:Why don't lists with the same values point to the same memory location in python? [duplicate]为什么具有相同值的列表不指向 python 中的相同内存位置? [复制]
【发布时间】:2019-09-28 21:43:38
【问题描述】:

考虑以下几点:

var1 = 'test test'
var2 = 'test test'

list1=[10,12,12,"Test"]

list2=[10,12,12,"Test"]

print(id(var1) == id(var2)) # True
print(id(list1) == id(list2)) # False

这个布尔表达式给出 False。这意味着 list1 和 list2 的内存位置不同。为什么具有相同值的变量指向相同的内存位置,而列表指向不同的位置?

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    列表是可变的。您不希望对一个表面上独立的列表进行更改,从而修改另一个巧合相同的列表。

    另一方面,字符串是不可变的。您不能对var1 进行会影响var2 的更改,因此可以共享底层对象。请注意,尽管 保证 两个 str 字面量生成相同的对象。何时以及是否发生此类缓存取决于实现。

    【讨论】:

      【解决方案2】:

      具有相同值的变量具有相同的id 这一事实是底层实现的产物。例如,小整数被实习;常见的字符串和显示为标识的字符串也是如此。这里的优点是 - 由于字符串和整数是不可变的 - 每次使用都可以引用相同的内存位置,从而减少内存消耗。

      但是,并非所有“相等”的值都是“相同的”。您的问题中提到的两个列表彼此独立。检测两个对象是否恰好相等是不可行的,只是为了节省一点内存,并且一旦它们变得不相等就必须将它们分开。

      foo is "bar" 而不是foo == "bar" 中查看字符串比较是一个常见的混淆来源。如果"bar" 已被实习,它似乎 可以在 CPython 上工作。但是,在其他解释器上比较总是错误的,

      【讨论】:

        【解决方案3】:

        由于字符串在 Python 中是不可变的,因此对象是否相同并没有什么区别 - 共享对象是 Python 应用的一种优化。它不能对列表执行此操作,因为它们可以修改。

        【讨论】:

          猜你喜欢
          • 2022-11-23
          • 1970-01-01
          • 2012-08-06
          • 2013-11-13
          • 2016-12-18
          • 1970-01-01
          • 2019-05-26
          • 1970-01-01
          • 2019-01-02
          相关资源
          最近更新 更多