Python 多行字符串是不是在内存中占用一些空间?

Posted

技术标签:

【中文标题】Python 多行字符串是不是在内存中占用一些空间?【英文标题】:Do Python multi-line strings take some space in the memory?Python 多行字符串是否在内存中占用一些空间? 【发布时间】:2021-06-04 20:23:40 【问题描述】:

Guido van Rossum tweeted:

Python 提示:您可以将多行字符串用作多行 cmets。 除非用作文档字符串,否则它们不会生成任何代码! :-)

下面的多行字符串在不用作 docstring 时是否会占用一些内存空间?

'''
Hello, folks!
This is a multi-line string.
'''

【问题讨论】:

多行字符串是普通字符串。字符串占用内存。 @khelwood 这是 Guido 的推文:Python 提示:您可以将多行字符串用作多行 cmets。除非用作文档字符串,否则它们不会生成任何代码! :-) 如果他们不生成字节码,他们将如何占用内存空间?这是我不明白的。 @SanjayRaut 看到我的回答,但 TLDR:cmets(和多行 cmets)不生成代码,它们只在您的源文件中! @A.D 但是Python中不存在真正意义上的多行cmets。 @snakecharmerb 这并不严格,例如代码"bar" + x 不包含对任何变量的赋值,但字符串"bar" 出现在编译的代码对象中。字符串根本不能在另一个表达式或语句中使用,赋值语句只是一种可能性。 【参考方案1】:

很容易确认,如果您自己编写一个字符串而不将其分配给变量或将其用作另一个语句或表达式的一部分,那么该字符串 (1) 不会生成任何 CPython 字节码,并且 (2) 确实不会出现在代码对象的常量元组中:

>>> code = 'x = 1; "bar"; x = 2;'
>>> from dis import dis
>>> dis(code)
  1           0 LOAD_CONST               0 (1)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (2)
              6 STORE_NAME               0 (x)
              8 LOAD_CONST               2 (None)
             10 RETURN_VALUE
>>> compile(code, '<string>', 'exec').co_consts
(1, 2, None)

所以字符串在编译时被丢弃,就像注释一样,因此不能在运行时出现在内存中。请注意,这适用于所有文字值,而不仅仅是多行字符串。

【讨论】:

嗯,这就是我想说的,但它以一种真正有意义的方式说,我将删除我的“答案” 我在文档中找不到对这种行为的引用(例如docs.python.org/3/reference/expressions.html#literals),所以我想知道这是否是严格的实现细节? @jonrsharpe 关于 CPython 字节码的一切都是 CPython 的实现细节 - 请参阅 docs 了解 dis 模块,第二段。官方参考中指定的语言语义根本不应该要求将 Python 编译为 CPython 字节码,并且有符合要求的 Python 实现,例如 PyPy。 是的,完全正确 - 我的意思是,可能存在 优化未使用的文字并因此 do 生成代码(并采取内存,即使只是短暂的)。 好吧,因为它是一个 CPython 实现细节,像PyPy 这样的其他实现可能会选择提供多行字符串内存空间,对吧?我很好奇PyPy 是否会这样做。

以上是关于Python 多行字符串是不是在内存中占用一些空间?的主要内容,如果未能解决你的问题,请参考以下文章

线程是不是占用其独立的内核空间?

一个string字符串占多少内存空间

常量和常变量有啥区别没

Android高效内存1:一张图片占用多少内存

为啥元组在内存中占用的空间比列表少?

c关于数组所占内存大小问题