我是Python新手。
在Python中,当我们说print("hello")时,是在堆中创建和存储了"hello",然后打印出来的对象,还是只是没有对象的print?
发布于 2021-12-06 20:52:19
你可以试试拆解,你会看到的。Python是一种解释语言,它的解释器是虚拟机(假设程序集被编译成机器指令,但从硬件层到软件层有点抽象)。
对于反汇编,Python提供了一个简单的dis.dis()函数。
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的实现,解释器选择使用编译时选项或运行时的库检测。
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
$ 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相关信息:
发布于 2021-12-06 20:54:33
我相信它创建了一个str对象,它的方法是str(),它调用print(),然后它就会收到垃圾收集,但是我可能错了。
https://stackoverflow.com/questions/70251800
复制相似问题