当前位置: 首页 > 面试题库 >

Python会内插字符串吗?

籍弘伟
2023-03-14
问题内容

在Java中,显式声明的String由JVM进行插值,因此对同一String的后续声明将导致指向同一String实例的两个指针,而不是两个单独(但相同)的String。

例如:

public String baz() {
    String a = "astring";
    return a;
}

public String bar() {
    String b = "astring"
    return b;
}

public void main() {
    String a = baz()
    String b = bar()
    assert(a == b) // passes
}

我的问题是,CPython(或任何其他Python运行时)是否对字符串做相同的事情?例如,如果我有一些课:

class example():
    def __init__():
        self._inst = 'instance'

并创建10个此类的实例,是否每个实例都有一个实例变量,该实例变量引用内存中的同一字符串,还是我将得到10个单独的字符串?


问题答案:

这称为Interning,是的,对于创建为字符串文字的较短字符串,Python会在某种程度上做到这一点。有关一些讨论,请参见关于更改不可变字符串的id。

实习取决于运行时,没有标准。实习总是在内存使用和检查是否创建相同字符串的成本之间进行权衡。如果您愿意的话,可以使用该sys.intern()函数来强制执行此问题,该函数记录了
一些 实习Python自动为您提供的功能:

通常,Python程序中使用的名称会被自动插入,并且用于保存模块,类或实例属性的字典具有插入键。

请注意,Python 2该intern()函数曾经是内置函数,无需导入。



 类似资料:
  • python中的字符串是不可变的对象。更改字符串应该会创建一个新对象,从而创建一个新id。 出于某种原因,当我尝试执行一个简单的字符串连接时,有时id会改变,有时则不会。我注意到当我所做的更改很小时,它往往不会改变id,但这似乎不是一个足够好的解释。只是想知道为什么会发生这种情况。 这是我闲置shell的截图。如果有人能解释一下,我会非常感激:) id有时更改,有时不更改的示例

  • 问题 你想创建一个字符串,让它包含体现某个 CoffeeScript 变量的文本。 解决方案 使用 CoffeeScript 中类似 Ruby 的字符串插值,而不是 JavaScript 的字符串拼接。 插值: muppet = "Beeker" favorite = "My favorite muppet is #{muppet}!" # => "My favorite muppet is B

  • 我只是尝试在HTML中插入从表单中提取的两个值。使用Flask和mysql.connector 这是我的index.html: 和我在python(app.py)中的行: 无论出于什么原因,我在执行第一个游标时会出现内部服务器错误,但“#”游标代码可以正常工作...请问谁能告诉我,我哪里出了问题。

  • 主要内容:处理字符串中的引号的,字符串的换行,Python长字符串,Python原始字符串若干个字符的集合就是一个 字符串(String)。 Python 中的字符串必须由双引号 或者单引号 包围,具体格式为: "字符串内容" '字符串内容' 字符串的内容可以包含字母、标点、特殊符号、中文、日文等全世界的所有文字。 下面都是合法的字符串: "123789" "123abc" "https://www.xnip.cn/python/" "小牛知识库成立8年了" Python 字符串中的双

  • 问题内容: 打印列表中元素之前的“ u”?我没有在代码中键入u。 当我运行此命令时,它将打印列表,但其格式如下: 那些“ u”来自列表中每个元素的位置? 问题答案: 我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的功能不同–无论是否为Unicode,这都是事实: 即使没有,您也有多余的引号,更不用说反斜杠转义了。而且,如果您使用字节字符串而不是字符串尝试相同的操作,那么您仍然会使用

  • 我正在尝试编写一个ANTLR语法,用于解析字符串插值表达式,例如: 我得到的错误是: MyParser。g4: MyLemus. g4: 像以下这样的表达式可以正常工作: 知道我做错了什么吗?