来自命令式编程背景,令人惊讶的是赋值运算符“=”使两个变量名指向内存中的相同位置,而不是将内存中的值从一个唯一对象复制到另一个。此模式既显示在本机数据类型(如列表)中,也显示使用“class”关键字定义的类。但是,我注意到这个规则有一个例外:
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"
这两个条件都满足。它们必须这样做,否则自然数的构造就会崩溃。有没有什么办法可以在我定义的类中利用这个常量?我希望有些课程不像“ln -s”,更像是“cp”。
答案 0 :(得分: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”,它可能(并且实际上)将被优化以引用相同的整数对象,因为它对于获取不同的整数对象永远不会有用具有相同的价值。