这个问题更像是一种好奇心。
我已经在Python中阅读了int对象的实现细节(1和2),据我所知,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 )
正如我所说,这主要是好奇心。提前谢谢!
答案 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?)