Python地址分配给变量

时间:2015-07-12 14:40:09

标签: python python-2.7 pass-by-reference memory-address pass-by-value

最初变量a,b和c都具有值1和相同的地址。当变量a递增1时,地址会改变,而变量b和c的地址保持不变。有人可以详细说明这个地址分配吗?

此外,当变量b递增1并且b的地址现在等于a的地址时。也有人可以详细说明吗?

>>> a = 1
>>> b = a
>>> c = b
>>> a += 1
>>> print a,b,c
2 1 1
>>> id(a)
26976576
>>> id(b)
26976600
>>> id(c)
26976600
>>> b += 1
>>> print a,b,c
2 2 1
>>> id(c)
26976600
>>> id(b)
26976576
>>> id(a)
26976576

3 个答案:

答案 0 :(得分:1)

https://docs.python.org/2/c-api/int.html#c.PyInt_FromLong

  

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。

此外,在Python中,Integer来自一个不可变对象:PyIntObject。创建PyIntObject后,您永远不会更改其值,其他人只是参考。

答案 1 :(得分:1)

值和内存地址都是误导性的术语。想想对象,名称和ID。首先,将对象1分配给名称abc。因此,所有名称都可以达到此对象的ID。

在第二步中,为名称a分配一个新对象,即整数2和其他ID。

在第三步中,您还将对象integer 2分配给b。这是CPython的一个实现细节,小整数只在内存中保存一次,因此名称b到达的对象及其ID与a相同。 / p>

答案 2 :(得分:0)

你看到这个的原因是因为你在考虑变量,abc是对象,实际上它是整数是你的例子的对象。键入id()时您正在查看的内存位置是int对象1int对象2的位置,而不是变量名称abc

在python中,名称绑定到对象。如果类似lists的类型是可变的并且您尝试复制它们,则可能会出现问题。更改对象意味着当您轮询两个引用时,您会看到在两者中传播的更改,并且不总是您想要的,除非您意识到它可能会导致调试时出现很多问题。

回到您的示例,我在开头添加了两个id()实例,以显示整数对象12的ID。这应该为你澄清一些事情。

>>> a = 1
>>> b = a
>>> c = a
>>> id(a)
4298174296
>>> id(b)
4298174296
>>> id(c)
4298174296
>>> id(1)
4298174296
>>> id(2)
4298174272
>>> a += 1
>>> id(a)
4298174272
>>> id(b)
4298174296
>>> id(c)
4298174296
>>> b += 1
>>> print a, b, c
2 2 1
>>> id(c)
4298174296
>>> id(b)
4298174272
>>> id(a)
>>> 4298174272

如您所见,1a b c的位置最初都是相同的,2的位置不同。然后,当您更改a的分配时,它会指向2的位置,而bc会指向1。然后,当您重新分配b时,它也会指向2的位置,只留下c指向1。

希望为您澄清一下。