为什么相等的整数与相等的列表的行为不同?

时间:2014-04-05 16:17:18

标签: python

这个问题更像是一种好奇心。

我已经在Python中阅读了int对象的实现细节(12),据我所知,Python int基本上是指向结构的C指针,对吗?

所以基本上问题是,Python 内部发生了什么所以在python中等于两个int并不等同于复杂类型的同一个实例,例如{ {1}},确实:

list

我的猜测是,通过查看上面实例的>>> a=5 >>> b=a >>> print "id a: %s, id b: %s" % (id(a), id(b)) id a: 40802136, id b: 40802136 >>> b+=1 >>> print "a: %s, b: %s" % (a, b) a: 5, b: 6 >>> print "id a: %s, id b: %s" % (id(a), id(b)) id a: 40802136, id b: 40802112 >>> a=[5] >>> b=a >>> print "id a: %s, id b: %s" % (id(a), id(b)) id a: 45930832, id b: 45930832 >>> b.append(1) >>> print "a: %s, b: %s" % (a, b) a: [5, 1], b: [5, 1] >>> print "id a: %s, id b: %s" % (id(a), id(b)) id a: 45930832, id b: 45930832 是因为修改整数会创建一个新实例并将新内存地址重新分配给变量。我的怀疑是否正确?如果是这样,有没有人知道"历史"有这样的行为的决定?当id变量被分配给其他变量时,程序员是不是很疯狂? (我对此完全没问题,顺便说一下: - D

正如我所说,这主要是好奇心。提前谢谢!

1 个答案:

答案 0 :(得分:4)

您没有修改原始整数,而是创建一个新整数并为其分配变量,因此id不同。

a = 5
b = a
b += 1             # created a new int
print id(a), id(b) # different

相同
a = 5
b = a
b = b + 1          # created a new int
print id(a), id(b) # different

list等价物不是使用append,而是使用+

a = [5]
b = a
b = b + [6]        # created a new list
print id(a), id(b) # different

append的{​​{1}}不等同,因为int无法修改,int可以修改。


唯一可能令人困惑的事情是

list

原因是a = [5] b = a b += [1] print id(a), id(b) # same 运算符(不幸的是,IMO)修改了原始列表,因此+=b += [1]不是等效语句。 (见Why does += behave unexpectedly on lists?

相关问题