gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:02:09 24 4
gpt4 key购买 nike

这个问题比其他任何问题都更让人好奇。

我一直在阅读 int 对象在 Python 中的实现细节(12),据我所知,一个 Python int基本上是一个指向结构的 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 是因为修改整数会创建一个新实例并将新的内存地址重新分配给变量。我的怀疑是否正确?如果是这样,有谁知道让 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

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

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

int 没有等效的 append,因为 int 不能修改,但 list 可以.


唯一可能令人困惑的是

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

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

关于python - 为什么相等整数的行为与相等列表不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com