2013-06-30 28 views
1

从命令式编程背景来看,令人惊讶的是,赋值运算符“=”使两个变量名指向内存中的相同位置,而不是从内存中复制内存中的值独特的对象到另一个。这种模式既出现在本地数据类型(如列表)中,也出现在使用'class'关键字定义的类中。然而,我注意到这条规则的一个例外:在Python中使用唯一的内存位置创建对象

a = 2 
if id(a) == id(2): 
    print "The id function returns the object's address in memory." 
a = 3 
if id(a) != id(2): 
    print "The hardcoded integer '2' does not get its address in memory re-assigned to that of 3" 

这两个条件都满足了。他们有必要这样做,否则自然数的构建就会崩溃。有什么方法可以在我定义的类中利用这个常量?我希望有些课程不像“ls -s”,更像是“cp”。

+0

这仅适用于-5到256之间的整数。请参阅此问题以获取更详细的解释:http://stackoverflow.com/questions/306313/python-is-operator-behaves-unexpectedly-with-integers – Blender

+0

复制模块/协议(http://docs.python.org/2/library/copy.html)是否提供了您想要的内容,或者您​​是否对覆盖分配特别感兴趣?如果是后者,可以使用描述符协议(http://docs.python.org/2/howto/descriptor.html)获得类似的内容,但它仍然不是您想要的。 – jcrudy

+0

复制模块确实提供了我正在寻找的内容。非常感谢你。 – seewalker

回答

0

(这应该是一个评论,但有点长。)

请注意,你似乎依靠的是你的榜样整数对象,但没有什么取决于它和整数并不特别 - - 他们只是普通的物体。 id(x)返回当前存储在x中的任何对象的标识。因此,如果我们适应你这样的例子中,我们得到了相同的结果:

object2 = [] # or any object, really 
object3 = [] # or any *other* object 
a = object2 
assert id(a) == id(object2) 
a = object3 
assert id(a) != id(object2) 

约整数唯一特别的是,如果你写在你的源代码“2”好几次,它可能(而且实际上会)被优化来引用相同的整数对象,因为使用相同的值获取不同的整数对象是没有用的。