【问题标题】:Understanding python's memory model [duplicate]了解python的内存模型[重复]
【发布时间】:2014-01-30 22:27:18
【问题描述】:

考虑以下日志:

>>> y = 20000
>>> id(y)
36638928
>>> y = 1000000
>>> id(y)
36639264

如您所见,更改y 的值后,它的id 也发生了变化。
这是否意味着int 是不可变的?幕后发生了什么?

谢谢!

【问题讨论】:

  • 是的,它是不可变的,它只是影响了一个名为 y 的新变量。随意在网上google这些东西,网上已经有很多资源了..
  • 您没有更改存储在y 中的值,而是为y 分配了一个新值。即使该值是可变的,这也会更改 id
  • 我推荐阅读bit.ly/pynames(真的是每一个python程序员)。
  • 这与int 是不可变的这一事实无关。分配的右侧是不同的对象,这很重要。

标签: python memory


【解决方案1】:

是的,整数是不可变的。你需要意识到的是:

  1. 变量只是用于引用对象的名称。

  2. 200001000000 是两个唯一 整数对象。这意味着它们永远不会同时共享相同的内存地址。

简单来说,当你执行这一行时:

y = 20000

发生了两件事:

  1. 在对象空间中创建一个整数对象20000

  2. 名称y 在命名空间中创建并指向该对象。

当你执行这个时:

y = 1000000

还有两件事发生:

  1. 在对象空间中创建了一个新的整数对象1000000

  2. 名称 y 更改为指向该对象,而不是 20000

【讨论】:

  • 我看到你在那里做了什么!
  • 这听起来像是x=10, y=10 然后id(x) != id(y) 这是不正确的,每个整数只出现一次,x 和 y 都引用它。
  • @cmd:这是一种实现细节,int 偶尔会被实习,但它们被实习的情况并不是语言的定义部分;例如;在我的机器上(cpython 2.7.6)1000 is 10001000 is not (999 + 1)
  • 老实说,20000 和 100000 可能会在不同的时间在内存中的同一位置结束,如果先出现的那个不再被引用并被释放。
  • 这不是“给定整数对象作为值”——正确的短语是“在命名空间中创建了一个名称y,并指向对象20000,即在对象空间中创建”,因为这实际上是正在发生的事情,并且是 Python 中的独特区别。变量不是“装东西的盒子”(这就是为什么它们在 Python 中被称为 names 而不是 variables)。
猜你喜欢
  • 2011-06-03
  • 2020-12-13
  • 2011-02-25
  • 1970-01-01
  • 2017-11-19
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多