【问题标题】:Are Python integers reference types?Python 整数是引用类型吗?
【发布时间】:2020-12-29 00:29:13
【问题描述】:

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

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

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

Python 中的整数不是也引用类型,因为在 Python 中一切都是对象吗?

【问题讨论】:

  • Python 中没有引用类型这样的东西。类型就是类型,每个名字都是对some对象的引用
  • 那为什么说列表是引用存储,整数是值存储呢?
  • 可能会这么说;我当然不会。 Python 中根本不存在这种区别。所有对象,无论是int 还是list,都只是,我们使用名称来引用它们。 x = 3x = [3]没有本质区别;在这两种情况下,x 指的是某种类型的值(前者为int,后者为list)。
  • 如果你想将列表称为引用类型,那么是的,int 也是一个引用类型,就像 Python 中的所有其他类型。当没有其他类型的类型与之对比时,术语“引用类型”在 Python 中没有任何意义。

标签: python types reference integer


【解决方案1】:

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

如果我们使用 .NET 的含义,那么是的,所有 Python 类型实际上都是“引用”类型,因为每个变量都是对对象的引用*,并且执行 a = b 将使 @ 987654322@ 指的是与b 相同的对象。然而,关于“引用类型”和“值类型”的事情是,当一个对象是不可变时,它不再是真正重要它是引用类型还是值类型.你不能做一件很重要的事情——你不能有两个对同一个对象的引用,通过其中一个来修改对象,然后在另一个发生变化时感到惊讶!

这是一种冗长的说法,当人们在 Python 中将整数称为“值类型”时,他们可能考虑用 C# 或 Java 来考虑它们,并观察到它们的行为很多与 C# 中的值类型或 Java 中的原语相同,因为它们确实如此!但这确实是因为它们比其他任何东西都更不可变。


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

【讨论】:

  • 所以当人们说整数是 Python 中的“值类型”时,它在技术上是错误的。相反,它们是不可变的引用类型。对吗?
  • 或多或少,是的。这取决于您如何重新解释 Python 的“值类型”一词。您可以合理地证明这是一个无意义的陈述,而不是一个不正确的陈述。
  • 但是,在谈论 Python 时,您根本不会使用术语“引用类型”。当首先只有一种可以谈论时,限定术语“类型”是没有意义的。更准确地说是“Python 的数据模型的值语义更接近 C++/C# 的引用类型,而不是其值类型。”
  • 另外,当变量本身有类型时,引用类型和值类型的区别更重要。在 Python 中,只有 values 有类型;变量只是一个可以引用任何类型的名称。在x = z; y = x 中,y 的值不能根据您分配给下一个x 的值类型而改变。
  • @coderboy 对。在 Java 中,您不能转身在下一行转到 x = "hello",但在 Python 中,您可以,因为 x 没有类型。
猜你喜欢
  • 2013-09-15
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2012-07-04
相关资源
最近更新 更多