Python 整数是引用类型吗?

Are Python integers reference types?

我们都知道 Python 中的列表是引用类型,即保存列表的变量不直接保存列表,而是保存对它的引用。

我们甚至都知道 Python 中的一切都是对象。

所以我想到的问题是整数也是 Python 中的对象,因此持有整数的变量也将包含对整数的引用;那为什么只有列表被分类为引用类型?

Python 中的整数不是也遵循 Python 中一切皆对象这一事实的引用类型吗?

这些概念并不真正适用于 Python。根据我的经验,“引用类型”和“值类型”主要用于 .NET 语言,例如 C#,它们在其中具有特定的含义 - 引用类型的变量存储对对象的引用,而值类型的变量存储值直接的对象。您无法获得对存储在变量中的该对象的引用(尽管您可以创建该值的“盒装”副本并获得对该框的引用)。这些术语可以在其他语言中类比使用 - 但例如在 Java all 类 中,.NET 认为是“引用类型”并且只有基元行为正如 .NET 中的“值类型”一样,这些术语并不是真正必要的。所以让我们 return 到 Python.

如果我们使用 .NET 的含义,那么 是的, 所有 Python 类型都是有效的“引用”类型,因为每个变量都是对一个变量的引用*对象并执行 a = b 将使 a 引用与 b 相同的对象。然而,关于“引用类型”和“值类型”的事情是,当一个对象是 immutable 它不再真的 matters 它是否是一个引用类型或值类型。你不能在区分很重要的地方做一件大事——你不能对同一个对象有两个引用,通过其中一个修改对象,然后在另一个更改时感到惊讶!

这是一种 long-winded 的说法,当人们在 Python 中称整数为“值类型”时,他们可能思考 C# 或 Java,并观察到它们的行为与 C# 中的值类型或 Java 中的原语非常相似,因为它们确实如此!但这真的是因为它们比其他任何东西都更不可变。


* 在这里,我使用的“引用”比 C# 中的特定引用更普遍。一般意义上是某种指定特定对象的句柄、地址或标识符,这样我们就可以拥有许多对单个对象的“引用”。 “引用”和“指针”都是通用术语,在某些语言中可能具有更具体的含义。例如,C# 引用是与 Java 引用非常相似的概念,但与 C++ 引用有很大不同。在某些语言中,“指针”特别是一个数字内存地址,您可以用算术操作它,在其他语言中,它与我描述的一般意义上的“引用”没有区别。我发现术语“参考”是描述我们在 Python 中最中性和最有用的术语,但在将一种语言与另一种语言进行比较时要小心所有这些术语。