我了解Python中可变对象和不可变对象之间的区别。我已经阅读了许多讨论差异的文章。但是,我还没有读到任何有关WHY整数是不可变对象的信息。
是否有这个原因?还是答案是“就是这样”?
编辑:我被提示将这个问题与其他问题“区分开”,因为这似乎是先前提出的问题。但是,我相信我要问的更多是哲学性的Python问题,而不是技术性的Python问题。
看来Python中的“原始”对象(即字符串,布尔值,数字等)是不可变的。我还注意到,由基元(即字典,列表,类)组成的派生数据类型是可变的。
画线的位置是否是可变对象?原始与衍生?
使整数可变是与我们惯常使用它们的方式非常违反直觉的。
考虑以下代码片段:
a = 1 # assign 1 to a b = a+2 # assign 3 to b, leave a at 1
执行完这些赋值后,我们期望 a 的值为1, b 的值为3。加法运算是根据存储在 a 中的整数和整数2的实例创建一个新的整数值。在整数 一个 ,只是它的突变然后既 一个 和 b 将具有值3。
因此,我们期望算术运算为其结果创建新值-而不会使它们的输入参数发生变异。
但是,在某些情况下,更改数据结构更方便,更有效。暂时让我们假设它list.append(x)没有修改,list但是返回了一个list带有x附加的新副本。然后是一个像这样的函数:
list.append(x)
list
x
def foo(): nums = [] for x in range(0,10): nums.append(x) return nums
只会返回空列表。(请记住,这里nums.append(x)不会改变nums,它会返回一个x附加了新列表的列表。但是这个新列表不会保存在任何地方。)
nums.append(x)
nums
我们将不得不这样编写foo例程:
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)我们都会复制一个列表,该列表的大小会增加,从而导致二次行为。由于这些原因,我们使列表成为 可变 对象。
nums = nums.append(x)
使列表可变的结果是在这些语句之后:
a = [1,2,3] b = a a.append(4)
列表 b 已更改为[1,2,3,4]。这是我们共同生活的东西,尽管它仍然时不时地绊倒我们。
[1,2,3,4]