Python整数是引用类型吗?

Python整数是引用类型吗?,python,types,reference,integer,Python,Types,Reference,Integer,我们都知道Python中的列表是引用类型,即保存列表的变量不直接保存列表,而是保存对列表的引用 我们都知道Python中的所有东西都是对象 所以我想到的问题是,在Python中,整数也是对象,所以持有整数的变量也会包含对整数的引用;那么为什么只有列表被归类为引用类型呢 Python中的整数不也是引用Python中的对象类型吗?这些概念在Python中并不真正适用。根据我的经验,“引用类型”和“值类型”主要用于.NET语言,如C#,它们有特定的含义-引用类型的变量存储对对象的引用,而值类型的变量直

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

我们都知道Python中的所有东西都是对象

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


Python中的整数不也是引用Python中的对象类型吗?

这些概念在Python中并不真正适用。根据我的经验,“引用类型”和“值类型”主要用于.NET语言,如C#,它们有特定的含义-引用类型的变量存储对对象的引用,而值类型的变量直接存储对象的值。您无法获取对存储在变量中的该对象的引用(尽管您可以创建该值的“装箱”副本并获取对该框的引用)。这些术语在其他语言中也可以类比使用——但例如在Java中,所有类都是.NET所认为的“引用类型”,只有原语在.NET中的行为与“值类型”相同,因此这些术语实际上并不必要。让我们回到Python

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

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



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

Python中没有引用类型。类型就是类型,每个名称都是对某些对象的引用,那么为什么我们说列表是通过引用存储的,整数是通过值存储的呢;我当然不知道。这种区别在Python中根本不存在。所有对象,无论是
int
类型还是
list
,都是,我们使用名称来引用它们。
x=3
x=[3]
之间没有根本区别;在这两种情况下,
x
都引用某种类型的值(前者是
int
,后者是
list
)。在Python中,如果没有其他类型可与之对比,那么术语“引用类型”在Python中没有任何意义。因此,当人们说整数在Python中是“值类型”时,从技术上讲是错误的。相反,它们是不可变的引用类型。对吧?或多或少,是的。这取决于您如何为Python重新解释术语“值类型”。您可以合理地认为这是一个无意义的语句,而不是一个不正确的语句。但是,同样,在谈论Python时,您不会使用术语“引用类型”。当一开始只讨论一种类型时,对“类型”一词进行限定是没有意义的。更准确的说法是“Python的数据模型的值语义更接近C++/C#的引用类型,而不是它的值类型。”此外,当变量本身具有类型时,引用类型和值类型之间的区别更为重要。在Python中,只有值具有类型;变量只是一个可以引用任何类型的名称。在
x=z;y=x
y
的值不能根据下一步分配给
x
的值的类型而改变。@coderboy right。在Java中,您不能转身进入下一行,但在Python中,您可以这样做,因为
x
没有类型。