首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中,当我们说print( "hello“)时,是在堆中创建并存储了一个带有”hello“的对象,然后再打印,还是它只是没有对象的打印呢?

在Python中,当我们说print( "hello“)时,是在堆中创建并存储了一个带有”hello“的对象,然后再打印,还是它只是没有对象的打印呢?
EN

Stack Overflow用户
提问于 2021-12-06 20:50:29
回答 2查看 137关注 0票数 1

我是Python新手。

在Python中,当我们说print("hello")时,是在堆中创建和存储了"hello",然后打印出来的对象,还是只是没有对象的print

EN

回答 2

Stack Overflow用户

发布于 2021-12-06 20:52:19

你可以试试拆解,你会看到的。Python是一种解释语言,它的解释器是虚拟机(假设程序集被编译成机器指令,但从硬件层到软件层有点抽象)。

对于反汇编,Python提供了一个简单的dis.dis()函数。

代码语言:javascript
复制
import dis

def hello():
    print("hello")

dis.dis(hello)

它创建了值(我在解析时会猜到,但不要引用我的话)。我需要将CPython的代码作为常量检查,然后在使用print函数的C实现时将其加载回VM中。

现在它的创建依赖于底层的Python解释器,在本例中是CPython ( PyPy是另一个)。对于CPython来说,应该是这样的:

Python中的内存管理涉及一个包含所有Python对象和数据结构的私有堆。(参考)

不能保证Python是一种独立的语言,但很可能是的,因为"hello"字符串不是封装在简单的数据存储(等等,低层类型)中,而是封装在复杂的C结构中。或者更好的说法是Python (PyObject),它通常使用Python的malloc或称为PyMalloc其他类似malloc的实现,解释器选择使用编译时选项或运行时的库检测。

代码语言:javascript
复制
  4           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('hello')
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

但是,正如注释中所指出的,与每个现代编译器(即使是Python)一样,代码也可以进行优化,因此它甚至可以被抛到原始C数据存储中(例如*char[]或类似的),然后只能通过Python的对象或优化的作者所希望的任何东西引用。要获得更详细的处理方法,您需要检查编译器的代码,并在编译步骤之后再检查优化操作。

只使用您的代码就可以更简单地解压缩。dis.dis()访问hello()函数中的代码块,因此结果是相同的,只是左边的行不是4,而是1

代码语言:javascript
复制
$ cat main.py;echo "---";python -m dis main.py
print("hello")
---
  1           0 LOAD_NAME                0 (print)
              2 LOAD_CONST               0 ('hello')
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE

相关信息:

票数 4
EN

Stack Overflow用户

发布于 2021-12-06 20:54:33

我相信它创建了一个str对象,它的方法是str(),它调用print(),然后它就会收到垃圾收集,但是我可能错了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70251800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档