当前位置: 首页 > 面试题库 >

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

暴博远
2023-03-14
问题内容

我了解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附加的新副本。然后是一个像这样的函数

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]。这是我们共同生活的东西,尽管它仍然时不时地绊倒我们。



 类似资料:
  • 问题内容: 我知道整数在Java中是不可变的。但是为什么要这样设计呢? 我找不到强制Integer不可变的用例。是否有类似String的技术原因? 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,则很容易遭到破坏。 支持StringPool功能。 支持使用字符串作为参数的类加载机制。字符串可变会导致加载错误的类。 我知道有些包装很易变。 更新: 从对话中,并没有普遍的理由要求整数是不可

  • 问题内容: 有人问我为什么String是不可变的 我这样回答: 当我们在Java中像这样创建一个字符串时,;将在字符串pool(hello)中创建一个对象,并且s1将指向hello。现在再次执行该操作;将不会创建另一个对象,但是s2将指向该对象,hello 因为JVM将首先检查如果在字符串池中是否存在相同的对象, 如果不存在则仅创建一个新对象。 现在,如果假设Java允许串可变那么如果我们改变S1

  • 问题内容: 为什么我不能执行以下操作: 我希望它能打印出来,因为我们用它覆盖了实例,但是它根本不做任何事情。甚至不会抛出错误。只是忽略分配。 我了解几乎没有任何人愿意这样做,但是您似乎做不到,这仍然很奇怪。 更新: 我现在知道 为什么 它不起作用,但是我仍然想知道是否有任何方法可以从实例中替换实例。 问题答案: 任何 简单的分配给 任何 的参数 任何 函数的行为确实是在Python以同样的方式:结

  • 本文向大家介绍String 为什 么是不可变的?相关面试题,主要包含被问及String 为什 么是不可变的?时的应答技巧和注意事项,需要的朋友参考一下 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 Ab

  • 问题内容: 我知道这可能很愚蠢,但是很多地方都声称Java中的Integer类是不可变的,但是下面的代码: 毫无困难地执行(给出预期的结果)6。因此有效地改变了a的值。这不是说Integer是可变的吗?第二个问题和一些小问题:“不变的类不需要复制构造函数”。有人在乎解释原因吗? 问题答案: 不可变并不意味着永远不能等于另一个值。例如,也是不可变的,但是我仍然可以这样做: 并没有改变,而是变成了一个