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

为什么整数在Python中是不可变的?,python,immutability,mutable,Python,Immutability,Mutable,我理解Python中可变对象和不可变对象之间的区别。我读过很多讨论这些差异的帖子。然而,我没有读到任何关于为什么整数是不可变对象的内容 这有什么原因吗?或者答案是“事情就是这样” 编辑:我被提示“区分”这个问题与其他问题,因为这似乎是以前问过的问题。然而,我相信我要问的更多的是一个哲学上的Python问题,而不是技术上的Python问题 Python中的“基本”对象(即字符串、布尔值、数字等)似乎是不可变的。我还注意到,由原语(即dict、list、class)组成的派生数据类型是可变的 无论一

我理解Python中可变对象和不可变对象之间的区别。我读过很多讨论这些差异的帖子。然而,我没有读到任何关于为什么整数是不可变对象的内容

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

编辑:我被提示“区分”这个问题与其他问题,因为这似乎是以前问过的问题。然而,我相信我要问的更多的是一个哲学上的Python问题,而不是技术上的Python问题

Python中的“基本”对象(即字符串、布尔值、数字等)似乎是不可变的。我还注意到,由原语(即dict、list、class)组成的派生数据类型是可变的


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

使整数可变将与我们使用它们的方式非常不直观

考虑以下代码片段:

a = 1       # assign 1 to a
b = a+2     # assign 3 to b, leave a at 1
执行这些赋值后,我们希望a的值为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
def foo():
  nums = []
  for x in range(0,10):
    nums = nums.append(x)
  return nums
将只返回空列表。(请记住-此处
nums.append(x)
不会更改
nums
-它会返回一个新列表,其中追加了
x
。但此新列表不会保存在任何位置。)

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

def foo():
  nums = []
  for x in range(0,10):
    nums.append(x)
  return nums
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]
。这是我们生活在其中的东西,尽管它仍然时不时地绊倒我们。

在Python中使数字不可变的设计决策是什么?

不变性有几个原因,让我们先看看不变性的原因是什么?

1-内存

  • 节省内存。如果大家都知道对象是不可变的,那么可以很容易地复制它,创建对同一对象的新引用
  • 表演。Python可以在创建时为不可变对象分配空间,并且存储需求是固定不变的
2-快速执行

  • 它不必复制对象的每个部分,只需一个简单的引用
  • 易于比较,通过引用比较相等比比较值快
3-安全:

  • 在多线程应用程序中,不同的线程可以与不可变对象中包含的数据交互,而不必担心数据的一致性
  • 即使有异常,程序的内部状态也将保持一致
  • 类应该是不可变的,除非有很好的理由使它们变为可变的……如果一个类不能变为不可变的,请尽可能限制它的可变性
4-易于使用

  • 更容易阅读,更容易维护,并且不太可能以奇怪和不可预测的方式失败
  • 不可变对象更容易测试,这不仅是因为它们易于模拟,还因为它们倾向于强制执行代码模式
5-。这意味着您可以使用字符串、数字或元组作为字典键。这是你想要使用的东西

The hash table implementation of dictionaries uses a hash value calculated from the key value to find the key. If the key were a mutable object, its value could change, and thus its hash could also change. But since whoever changes the key object can’t tell that it was being used as a dictionary key, it can’t move the entry around in the dictionary. Then, when you try to look up the same object in the dictionary it won’t be found because its hash value is different. If you tried to look up the old value it wouldn’t be found either, because the value of the object found in that hash bin would be different.

返回整数:

  • 安全性(3)、易用性(4)以及在字典中将数字用作键的能力(5)是做出数字不可变决定的原因

  • 自创建时起具有固定的内存要求(1

  • Python中的All是一个对象,数字(如字符串)是“基本”对象。再多的活动也不会将值8更改为任何其他值,再多的活动也不会将字符串“八”更改为任何其他值。这是因为一个太大的问题


对于一个整数,您到底想变异什么?bits?假设某些类型的不变性可以实现各种优化。这些优化在
str
中最为明显,但在
int
float
tuple
frozenset
中也发挥了作用。。。有些人可能会争辩说,不变性也使代码在很多情况下更易于阅读。再加上没有一种自然的方式来突变整数(除了非常罕见的
+=
*=
,…之外)如果你能将
1
的值修改为
2
,将
2
的值修改为
1
,那么
2+2==1
就是
true
;这真的是你想要的吗?你可能会发现(对StanleyR上面的问题)很有帮助。我不认为“使整数可变”这句话会与我们习惯于使用它们的方式非常相反。一定是正确的。还有很多其他的语言