在Python中,所有文本值都会导致对象的创建

在Python中,所有文本值都会导致对象的创建,python,Python,这是什么意思“在Python中,所有文本值都会导致对象的创建” 我正在学习Python,从这里得到了这句话: 但我并不真正理解它的含义 首先,什么是“文字值” 第二,请解释这句话 如果你能举一些例子,那会很有帮助的 Python实际上在不同的上下文中对“literal”有一些定义,但如果您只想了解基本概念的话:像123这样的数字和像“abc”这样的字符串都是literal;像123+456这样的表达式不适用 在Java中,当您编写123时,它不是对Java对象的引用,而是一个“本机”整数。在P

这是什么意思“在Python中,所有文本值都会导致对象的创建”

我正在学习Python,从这里得到了这句话:

但我并不真正理解它的含义

首先,什么是“文字值”

第二,请解释这句话


如果你能举一些例子,那会很有帮助的

Python实际上在不同的上下文中对“literal”有一些定义,但如果您只想了解基本概念的话:像
123
这样的数字和像
“abc”
这样的字符串都是literal;像
123+456
这样的表达式不适用

在Java中,当您编写
123
时,它不是对Java对象的引用,而是一个“本机”整数。在Python中,它是对Python对象的引用

因为在Python中一切都是一个对象,所以整数有方法,可以卡在集合中,等等。任何地方都没有“装箱”和“拆箱”。如果我想将
123
粘贴到列表中,我只需执行以下操作:

>>> my_list = list()
>>> my_list.append(123)
>>> my_list
[123]
>>> my_list[0] - 120
3
如果我想使用列表中的值作为整数,我只需执行以下操作:

>>> my_list = list()
>>> my_list.append(123)
>>> my_list
[123]
>>> my_list[0] - 120
3
因此,我可以像其他对象一样使用文字编写一个列表显示:

>>> my_other_list = [my_list, 2]
(只是不要问列表显示是否也是文字,因为这才是“不同上下文的不同定义”真正重要的时候…)


值得指出的是,“所有文字值都会导致对象的创建”这一说法并非真的。文字可以是一个新对象,但也可以是对现有对象的引用,其值与该对象的值相同。例如:

>>> a = 3
>>> b = 3
>>> a is b
True
>>> id(a) == id(b)
True
(这种语言不能保证这一点,但在大多数Python实现中通常都是如此。)

因此,
b=3
没有导致对象的创建,只是对
a=3
中相同对象的另一个引用。(事实上,
3
很可能是解释器在查看代码之前就已经预构建和预缓存了。)


但是您不需要关心这一点,因为
3
是不可变的。不管您得到的是相同的
3
对象还是不同的对象,因为除了
is
id
,没有办法区分它们之间的区别。字符串、浮点等也是如此。

以下是文本值的示例

>>> 0
0
>>> 'a'
'a'
>>> 1.9
1.9
>>> 'foo'
'foo'
一切都是一个对象,即使是
int
s,如下所示,您可以看到
0
的方法:

>>> dir(0)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
如果我愿意,我可以打电话:

>>> (-1).__abs__() # abs(-1) is better but this is just to show it's an object
1

这意味着,当您键入任何值,如
1234
67.2
,或
“这是一个字符串”
,它将作为一个对象处理。

学习Python的一个非常好的方法是使用交互式解释器(通常通过在shell中键入
Python

完成此操作后,使用
\uu
类型
目录
,和
帮助
查看对象类型和信息,如下所示:

>>> 4             # a literal 4
4
>>> type(_)       # what is the type of the last object?
<type 'int'>      # int
>>> dir(int)      # what methods does it have?
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> help(int)
... bunch of help text on int class ...

>>> type(4.4)
<type 'float'>
# do the same interview of Python to tell you about the float class...
>4#文字4
4.
>>>类型(35;)#最后一个对象的类型是什么?
#int
>>>dir(int)#它有什么方法?
“大学和大学”的,“大学类”的“大学课程”的,“大学课程”的“大学课程”的,“大学cmp的”的“大学校园校园网的”的“大学校园网的”的“大学校园网的”的“大学校园网的”的“大学校园网的”的“大学校园网的”的“大学校园网”的“大学校园网的”的,“大学校园校园网”和“大学校园网的”和“大学类的“大学校园网,”大学校园网的“大学校园网,学校的校园网,校园网,学校的校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,校园网,学校,“,”哈希“,”十六进制“,”索引“,”初始“,”整数“,”反转“,”长“,”移位“,”模“,”新“,”__“非零零零的,”非零零零的一些,”,”非零零零零的一些,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,","r r r r r r r r u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u r r r r r r r u u u u u u u u u u u u u u u u u r r r r u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u r r r r r u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u u,“\uuuu子类hook\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu子类hook\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>帮助(int)
... int类上的一堆帮助文本。。。
>>>类型(4.4)
#做同样的Python访谈,告诉你关于float类的事情。。。

我想它说在Python中,一切都是一个对象。@Blender不是真正等价的。@Lattyware:我不认为所有的文字值都会导致对象的创建(如果我没记错的话,Python会在启动时为前256个整数创建对象)。你怎么说呢?一个文字总是会被它所代表的对象所取代。(更简单的例子是
None
——它始终是同一个对象,而不是缓存小整数)。并不是我认为你的陈述是错误的,只是它有点过于简单化,没有真正回答字面上的部分。我认为最重要的是要注意类似于
“”。join(…)
是可能的,因为
“”
是一个文本空字符串,这会导致一个字符串对象,您可以调用
join()
。@Blender这是一个CPython实现细节,除非您错误地将值与
is
进行比较,你永远不会注意到。(此外,它还包括一些小的负整数。)