我有一个Python程序,其中两个变量设置为该值'public'.在条件表达式中,我的比较var1 is var2失败了,但是如果我将其更改为var1 == var2它则返回True.
现在,如果我打开我的Python解释器并进行相同的"是"比较,它就会成功.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我遇到了关于词典内存管理的问题,提到了实习功能.它究竟做了什么,何时使用?
举个例子:
如果我有一组称为看出,包含形式的元组(字符串1,字符串),我用它来检查重复,会存储(实习生(字符串1),实习生(字符串2))提高性能WRT内存或速度?
Python是否拥有所有字符串的池并且它们是(字符串)单例吗?
更准确地说,在下面的代码中,在内存中创建了一个或两个字符串:
a = str(num)
b = str(num)
Run Code Online (Sandbox Code Playgroud)
?
我了解到,在一些一成不变的类,__new__可能会返回一个现有实例-这是什么int,str以及tuple各类有时小的值做.
但为什么以下两个片段的行为不同?
最后有一个空格:
>>> a = 'string '
>>> b = 'string '
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)
没有空间:
>>> c = 'string'
>>> d = 'string'
>>> c is d
True
Run Code Online (Sandbox Code Playgroud)
为什么空间带来了差异?
我正在构建一个Python实用程序,它将涉及将整数映射到字符串,其中许多整数可能映射到相同的字符串.根据我的理解,默认情况下Python实习短字符串和大多数硬编码字符串,因此通过在表中保留字符串的"规范"版本来节省内存开销.我认为我可以通过实习字符串值从中受益,即使字符串实习更多地用于密钥散列优化.我写了一个快速测试,它检查长字符串的字符串相等性,首先只存储列表中的字符串,然后将字符串存储在字典中作为值.这种行为对我来说意外:
import sys
top = 10000
non1 = []
non2 = []
for i in range(top):
s1 = '{:010d}'.format(i)
s2 = '{:010d}'.format(i)
non1.append(s1)
non2.append(s2)
same = True
for i in range(top):
same = same and (non1[i] is non2[i])
print("non: ", same) # prints False
del non1[:]
del non2[:]
with1 = []
with2 = []
for i in range(top):
s1 = sys.intern('{:010d}'.format(i))
s2 = sys.intern('{:010d}'.format(i))
with1.append(s1)
with2.append(s2)
same = True
for i in range(top):
same = same and (with1[i] is with2[i]) …Run Code Online (Sandbox Code Playgroud) 当您执行子串操作时,python是否会创建一个全新的字符串(复制内容):
new_string = my_old_string[foo:bar]
Run Code Online (Sandbox Code Playgroud)
或者它是否使用实习来指向旧数据?
作为澄清,我很好奇底层字符缓冲区是否像Java一样共享.我意识到字符串是不可变的,并且总是看起来是一个全新的字符串,它必须是一个全新的字符串对象.
python ×6
string ×4
memory ×2
python-3.x ×2
comparison ×1
cpython ×1
dictionary ×1
equality ×1
identity ×1
immutability ×1
singleton ×1