【问题标题】:I want to know the memory location for a list and normal variable in python [duplicate]我想知道python中列表和普通变量的内存位置[重复]
【发布时间】:2016-08-14 05:36:30
【问题描述】:

我将一个值存储在一个变量中,并将相同的值存储在另一个变量中,然后它为两个变量提供相同的 id。但是如果我将一个列表分配给一个变量,而将同一个列表分配给另一个变量,那么 ID 不同,为什么?

我的示例程序是:

>>> x=10
>>> y=10
>>> id(x)
21122368
>>> id(y)
21122368


>>> x=[1,2,3]
>>> y=[1,2,3]
>>> id(x)
35525896
>>> id(y)
35527736

【问题讨论】:

  • 因为它是一个不同的列表,你在其中放置了相同的内容。
  • 整数是不可变的,因此无论是否重用都没有区别。然而,列表是可变的,并且必须是单独的实例才能提供预期的行为。
  • 它可能是数十个(字面意思)类似问题的重复。
  • 我忘了提,而 Python 程序员可能需要知道 object 的内存位置(注意我没有写 variable ),因此在语言中包含 id(),它们通常不会。
  • 如果是这种情况,您所说的不可变和 nutable 的行为会有所不同,字符串也是不可变的,但对于字符串,我分配的内存位置相同

标签: python


【解决方案1】:

这是由于最流行的 Python 实现中的优化所致。基本上,小整数不会被创建为完整的对象,而是您会收到对现有小整数的引用,并且每次都是同一个。

【讨论】:

    【解决方案2】:

    一些不可变对象被缓存在python中,例如一些数字和字符串。这意味着,当您编写 1 时,您将获得对堆上已存在的对象的引用。

    列表没有被缓存(没有什么意义,因为它们是可变的),因此它们具有不同的身份,尽管它们可以在内容上相同。

    也许稍微比较会有所帮助。每个看月亮的人都看到了同一个月亮(这将得到对1的引用)......因此你可以这么说

    id(my_moon) == id(your_moon)
    

    或者只是

    my_moon is your_moon
    

    由于月亮就是月亮,而11,python 的一些实现出于性能原因决定缓存这个对象。

    另一方面,可变对象是一个可怕的缓存候选对象。例如,每个拿一袋薯片的人,都拿了一袋薯片的不同实例,因此在某个时候可能是这样

    my_chips == your_chips
    

    因为他们有相同数量的筹码,但无论如何都不会

    id(my_chips) == id(your_chips)

    因为这意味着对象是共享的,并且当其他人吃下芯片(改变芯片包对象)时,芯片会从您的包中消失......这将是一个可怕的世界:)

    【讨论】:

    • 如果是这种情况,您所说的不可变和 nutable 的行为会有所不同,字符串也是不可变的,但对于字符串,我分配的内存位置相同
    • 例子:>>> x="s" >>> y="s" >>> id(x) 21122368 >>> id(y) 21122368
    • 我不明白你的评论。出于性能原因(这取决于实现),Python VM 缓存了一些不可变对象。有时会缓存字符串和整数,这就是您的情况。这就是为什么1 is 1's' is 's'
    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2018-05-12
    • 2019-02-21
    相关资源
    最近更新 更多