在 Python 中击败字符串实习的最简单方法
Simplest way to defeat string interning in Python
我有一个案例想打败字符串实习。
假设我的字符串是 "foo bar"
.
我知道一些 hacky/not 明显的方法来阻止字符串的驻留。所有都涉及在运行时计算表达式。
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
,它可以实习一个字符串。我想做完全相反的事情,不是以simple/descriptive的方式实习。
有什么东西可以以“干净”的方式击败字符串实习吗?
我想在 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
但我认为这很愚蠢...
您还可以继承 str
。
>>> class UninternedStr(str):
... pass
...
>>> s = UninternedStr('a string')
>>> s1 = UninternedStr('a string')
>>> s is s1
False
我有一个案例想打败字符串实习。
假设我的字符串是 "foo bar"
.
我知道一些 hacky/not 明显的方法来阻止字符串的驻留。所有都涉及在运行时计算表达式。
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
,它可以实习一个字符串。我想做完全相反的事情,不是以simple/descriptive的方式实习。
有什么东西可以以“干净”的方式击败字符串实习吗?
我想在 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
但我认为这很愚蠢...
您还可以继承 str
。
>>> class UninternedStr(str):
... pass
...
>>> s = UninternedStr('a string')
>>> s1 = UninternedStr('a string')
>>> s is s1
False