使整数可变将与我们习惯使用它们的方式非常不直观。
考虑以下代码片段:
a = 1 # assign 1 to a
b = a+2 # assign 3 to b, leave a at 1
后这些任务执行我们预计一个有值1和b有值3加法运算是创建一个新的整数值从存储的整数和整数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
(这其实是非常相似,在使用Python字符串局面直到大约2.6或者是2.5)。
而且,我们每次分配nums = nums.append(x)
时间,我们将复制大小为导致增加的列表在二次行为。 由于这些原因,我们列出了可变对象对象。
的后果,以使列出可变的是,这些语句后:
a = [1,2,3]
b = a
a.append(4)
列表b已更改为[1,2,3,4]
。这是我们生活的东西,尽管它现在仍然让我们trips trips不安。
你想要改变一个整数究竟是什么?位? –
假设某些类型的不变性可以实现各种优化。这些优化对于'str'来说是_most_发音,但它们也起作用于'int','float','tuple','frozenset' ......有些人可能会认为不变性使得代码更易于阅读情况也一样。再加上事实上,没有一种自然的方式来改变整数(除了'+ =','* =',...这是非常罕见的......),而且似乎并不好没有一成不变的理由。 – mgilson
如果你可以修改值'1'为'2',值'2'为'1',那么'2 + 2 == 1'就是'true';那真的是你想要的吗? –