gpt4 book ai didi

python - 为什么整数在 Python 中是不可变的?

转载 作者:太空狗 更新时间:2023-10-29 17:04:54 24 4
gpt4 key购买 nike

我了解 Python 中可变对象和不可变对象(immutable对象)之间的区别。我已经阅读了许多讨论差异的帖子。但是,我还没有读到任何关于为什么整数是不可变对象(immutable对象)的内容。

这有什么原因吗?或者答案是“事情就是这样”?

编辑:系统提示我将此问题与其他问题“区分开来”,因为它似乎是先前提出的问题。但是,我相信我要问的更多是哲学 Python 问题,而不是技术 Python 问题。

Python 中的“原始”对象(即字符串、 bool 值、数字等)似乎是不可变的。我还注意到,由原语(即字典、列表、类)组成的派生数据类型是可变的。

无论对象是否可变,这就是画线的地方吗?原始还是派生?

最佳答案

使整数可变与我们习惯使用它们的方式非常违反直觉。

考虑这个代码片段:

a = 1       # assign 1 to a
b = a+2 # assign 3 to b, leave a at 1

执行这些赋值后,我们期望 a 的值为 1,b 的值为 3。加法运算是从整数创建一个新的整数值存储在 a 和整数 2 的实例中。如果加法运算只是取 a 处的整数并对其进行变异,则 ab 都将具有值 3。

因此我们希望算术运算为其结果创建新值 - 而不是改变其输入参数。

但是,在某些情况下,改变数据结构更方便、更高效。让我们暂时假设 list.append(x) 没有修改 list 但返回了 list 的新副本,其中包含 x附加。然后是这样的函数:

def foo():
nums = []
for x in range(0,10):
nums.append(x)
return nums

只会返回空列表。 (记住 - 这里 nums.append(x) 不会改变 nums - 它返回一个附加了 x 的新列表。但是这个新列表没有保存在任何地方。)

我们必须像这样编写 foo 例程:

def foo():
nums = []
for x in range(0,10):
nums = nums.append(x)
return nums

(事实上,这与 2.6 或 2.5 之前的 Python 字符串的情况非常相似。)

此外,每次我们分配 nums = nums.append(x) 时,我们都会复制一个列表,该列表的大小会增加,从而导致二次行为。出于这些原因,我们制作了列表可变对象。

使列表可变的结果是在这些语句之后:

a = [1,2,3]
b = a
a.append(4)

列表 b 已更改为 [1,2,3,4]。这是我们一直在忍受的事情,尽管它时不时地会绊倒我们。

关于python - 为什么整数在 Python 中是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535694/

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