在Python中击败字符串实习的最简单方法[重复]

Posted

技术标签:

【中文标题】在Python中击败字符串实习的最简单方法[重复]【英文标题】:Simplest way to defeat string interning in Python [duplicate] 【发布时间】:2021-08-08 06:29:51 【问题描述】:

我有一个案例,我想打败字符串实习。

假设我的字符串是"foo bar"

我知道一些破解字符串的技巧/不明显的方法。所有这些都涉及在运行时计算表达式。

In [1]: my_str = "foo bar"
In [2]: my_new_str1 = " ".join(["foo", "bar"])
In [3]: my_new_str2 = "foo bar "[:-1]
In [4]: my_new_str3 = "foo " + "bar"

In [5]: id(my_str)
Out[5]: 4483028144

In [6]: id(my_new_str1)
Out[6]: 4483030192

In [7]: id(my_new_str2)
Out[7]: 4484125872

In [8]: id(my_new_str3)
Out[8]: 4484052336

有一个内置函数sys.intern,它可以实习一个字符串。我希望做完全相反的事情,不是以简单/描述性的方式实习。

有什么东西可以以“干净”的方式击败字符串实习吗?

【问题讨论】:

请说出原因? 为什么需要避免字符串实习?字符串是不可变的,这意味着一旦你有了字符串,就没有人可以改变它 长话短说,我希望is 支票返回False。所以如果我说spam = "hi"ham = "hi",我希望spam is ham返回False This answer 拥有最直接的低级副本。 【参考方案1】:

我想在 join 周围放一个函数:

def new_str(s):
    return ''.join(s)

>>> s='a string'

>>> s1=new_str(s)

>>> id(s)
4568404208

>>> id(s1)
4569455664

>>> s is s1
False

但我认为这很愚蠢......

【讨论】:

是的,谢谢@dawg 的回答。在 OP 中,我已经将.join 作为一种方法。我想知道是否有更具描述性/有意义的方式。我不希望在我的客户端代码中添加实用程序函数new_str,即使它的代码行不多 描述性有意义在旁观者的眼中。什么对您来说具有描述性和意义?【参考方案2】:

你也可以继承str

>>> class UninternedStr(str):
...   pass
... 
>>> s = UninternedStr('a string')
>>> s1 = UninternedStr('a string')
>>> s is s1
False

【讨论】:

以上是关于在Python中击败字符串实习的最简单方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中将字符转换为其 ascii 等价物的最简单方法是啥? [复制]

在 Python 中使用 rm -rf 的最简单方法

在Java 8中将整数数组转换为字符串数组的最简单方法[重复]

用 Python 交换字符串中每对相邻字符的最简单方法是啥?

创建初始重复数据的二维字符串数组的最有效方法是啥?

在c#/LINQ中将数组转换为字符串的最短方法[重复]