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

如果值已经是字符串,我应该避免转换为字符串吗?

宋烨烁
2023-03-14
问题内容

有时,您必须使用列表推导将所有内容转换为字符串,包括字符串本身。

b = [str(a) for a in l]

但是我必须要做:

b = [a if type(a)==str else str(a) for a in l]

我想知道是否str对字符串进行了足够的html" target="_blank">优化,以至于 不会 创建该字符串的另一个副本。

我试过了:

>>> x="aaaaaa"
>>> str(x) is x
True

但这可能是因为Python可以缓存字符串并重用它们。但是,对于任何字符串值,都可以保证该行为吗?


问题答案:

测试对象是否已经是字符串要比总是转换为字符串慢。

那是因为该str()方法也进行了完全相同的html" target="_blank">测试(对象已经是字符串了)。您是(a)做两倍的工作,并且(b)您的测试启动较慢。

注意:对于Python
2,str()在onunicode对象上使用包含ASCII的隐式编码,这可能会失败。您可能仍需要特殊处理此类对象。在Python
3中,无需担心这种极端情况。

由于对此有一些讨论:

  • isinstance(s, str)有不同的含义时,s可以是一个 子类str。由于子类与对象的任何其他类型完全一样str()__str____repr__在对象上被调用),因此这里的区别很重要。
  • 您应该使用type(s) is str精确类型检查。类型是单例,请利用此方法,is速度更快:

    >>> import timeit
    

    timeit.timeit(“type(s) is str”, “s = ‘’“)
    0.10074466899823165
    timeit.timeit(“type(s) == str”, “s = ‘’“)
    0.1110201120027341

  • s if type(s) is str else str(s)对于 非字符串情况, 使用速度明显慢:

    >>> import timeit
    

    timeit.timeit(“str(s)”, “s = None”)
    0.1823573520014179
    timeit.timeit(“s if type(s) is str else str(s)”, “s = None”)
    0.29589492800005246
    timeit.timeit(“str(s)”, “s = ‘’“)
    0.11716728399915155
    timeit.timeit(“s if type(s) is str else str(s)”, “s = ‘’“)
    0.12032335300318664

s = ''案件的时机非常接近,并不断交换位置)。

本文中的所有计时都是在Macbook Pro 15英寸(2015年中),OS X 10.12.3上的Python 3.6.0上执行的。



 类似资料:
  • 问题内容: 我需要将(4个字节)的char转换为其他字符(在Python中)。这是将其插入到我的utf-8 mysql数据库中,而不会出现诸如以下的错误:“不正确的字符串值:行1的’行’的’\ xF0 \ x9F \ x94 \ x8E’ 通过向mysql插入4字节的unicode引发的警告显示了这样做的方法: 但是,在注释“ …错误的字符范围..”中,我得到与用户相同的错误,这显然是因为我的Py

  • 问题内容: 如何将经典字符串转换为f字符串? 输出: 所需的输出: 问题答案: f字符串是 语法 ,而不是对象类型。您不能将任意字符串转换为该语法,该语法会创建一个字符串对象,而不是相反。 我假设您想用作模板,因此只需在对象上使用方法: 如果要提供可配置的模板服务,请创建一个包含所有可以插值的字段的名称空间字典,并与调用语法一起使用以应用名称空间: 然后,用户可以在字段中的名称空间中使用任何键(或

  • 问题内容: 我正在阅读有关python的新f字符串的 博客 ,它们看起来很整洁。但是,我希望能够从字符串或文件中加载f字符串。 我似乎找不到任何执行此操作的字符串方法或其他函数。 从上面我的链接中的示例: 但是,如果我有琴弦怎么办?我希望能够像这样: 事实证明,我已经可以执行类似的操作并获得性能提高。即: 问题答案: f字符串是代码。不仅以安全的方式(当然,字符串文字就是代码),而且以危险的任意代

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页

  • 问题内容: 是否可以将模板字符串创建为常规字符串 然后将其转换为模板字符串 没有,以及其他动态代码生成方式? 问题答案: 由于您的模板字符串必须动态地(在运行时)引用该变量,因此答案是: 否,没有动态代码生成是不可能的。 但这很简单: