- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我了解 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 处的整数并对其进行变异,则 a 和 b 都将具有值 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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!