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

2023-12-30

这个问题更多的是出于好奇。

我一直在阅读Python中int对象的实现细节(1 http://www.laurentluce.com/posts/python-integer-objects-implementation/ and 2 http://svn.python.org/projects/python/trunk/Objects/intobject.c),据我所知,Pythonint https://docs.python.org/2/c-api/int.html基本上是一个指向结构体的 C 指针,对吗?

所以问题基本上是,Python 中会发生什么内部所以等于二intpython中的s在等于复杂类型时并不指向同一个实例,例如list, does:

>>> 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上面实例的原因是修改整数会创建一个新实例并将新的内存地址重新分配给变量。我的怀疑正确吗?如果是这样,有谁知道让 int 表现得像这样的“历史”决定?是不是这样程序员就不会发疯了int变量被分配给其他变量? (顺便说一句,我对此完全同意:-D )

正如我所说,这主要是出于好奇。先感谢您!


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

The list等效不会使用append,但要使用+:

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

没有同等的append for ints,因为ints 无法修改,但是lists can.


唯一可能令人困惑的是

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

原因是,+=操作员(不幸的是,IMO)修改了原始列表,所以b += [1] and b = b + [1]不是等价的陈述。 (看为什么 += 在列表上表现异常? https://stackoverflow.com/questions/2347265/why-does-behave-unexpectedly-on-lists?rq=1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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