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

2024-04-26 13:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题更像是一种好奇心。你知道吗

我一直在阅读Python(12)中int对象实现的细节,据我所知,Pythonint基本上是指向结构的C指针,对吧?你知道吗

所以问题基本上是,在Python内部发生了什么,所以在Python中均衡两个int并不指向同一个实例,而均衡复杂类型(如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是因为修改一个整数会创建一个新实例,并将新的内存地址重新分配给变量。我的怀疑正确吗?如果是这样的话,有人知道ints这样做的“历史”决定吗?当int变量被分配给其他变量时,程序员不会发疯吗?(我完全同意,顺便说一句:-D)

正如我所说,这主要是一种好奇心。提前谢谢!你知道吗


Tags: 对象实例id类型整数结构细节list
1条回答
网友
1楼 · 发布于 2024-04-26 13:23:48

您没有修改原始整数,而是创建一个新整数并将变量赋给它,因此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

对于ints,append不是等价的,因为ints不能修改,而lists可以修改。你知道吗


唯一可能令人困惑的是

a = [5]
b = a
b += [1]
print id(a), id(b) # same

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

相关问题 更多 >