python string Industring
虽然这个问题在实践中没有任何真正的用途,但我很好奇python如何进行弦乐实践。我注意到以下内容。
>>> "string" is "string"
True
这是我所期望的。
您也可以这样做。
>>> "strin"+"g" is "string"
True
那很聪明!
但是你不能这样做。
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
为什么Python不评估s1+“ G”
,并意识到它与s2
相同,并将其指向同一地址?在最后一个块中实际发生了什么,以使其返回false
?
While this question doesn't have any real use in practice, I am curious as to how Python does string interning. I have noticed the following.
>>> "string" is "string"
True
This is as I expected.
You can also do this.
>>> "strin"+"g" is "string"
True
And that's pretty clever!
But you can't do this.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
Why wouldn't Python evaluate s1+"g"
, and realize it is the same as s2
and point it to the same address? What is actually going on in that last block to have it return False
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是特定于实现的,但是您的解释器可能是实时编译时间常数,而不是运行时表达式的结果。
在以下内容中,使用了Cpython 3.9.0+。
在第二个示例中,在编译时评估了表达式
“ strin”+“ g”
,并用“ string”
替换。这使得前两个示例的行为相同。如果我们检查字节码,我们会发现它们完全相同:
此字节是用(在上面的另外几行打印):
第三个示例涉及一个运行时串联,其结果不是自动实施:
此字节码是用(在上述之前打印了几行),并且这些行与上面给出的第一个bytecodes的第一个块一样):
如果您要手动
另外,Python 3.9在上面的最后两个语句中打印警告:
This is implementation-specific, but your interpreter is probably interning compile-time constants but not the results of run-time expressions.
In what follows CPython 3.9.0+ is used.
In the second example, the expression
"strin"+"g"
is evaluated at compile time, and is replaced with"string"
. This makes the first two examples behave the same.If we examine the bytecodes, we'll see that they are exactly the same:
This bytecode was obtained with (which prints a few more lines after the above):
The third example involves a run-time concatenation, the result of which is not automatically interned:
This bytecode was obtained with (which prints a few more lines before the above, and those lines are exactly as in the first block of bytecodes given above):
If you were to manually
sys.intern()
the result of the third expression, you'd get the same object as before:Also, Python 3.9 prints a warning for the last two statements above:
案例1
案例2
现在,您的问题是为什么ID在案例1中是相同的,而不是在情况2中。
在情况1中,您已将字符串文字
“ 123”
分配给x
和y
。由于字符串是不变的,因此解释器仅存储字符串一次并将所有变量指向同一对象是有意义的。
因此,您认为ID是相同的。
在情况2中,您正在使用串联修改
x
。x
和y
具有相同的值,但不是相同的身份。这两个指向内存中的不同对象。因此,它们具有不同的
ID
和是
运算符返回false
Case 1
Case 2
Now, your question is why the id is same in case 1 and not in case 2.
In case 1, you have assigned a string literal
"123"
tox
andy
.Since string are immutable, it makes sense for the interpreter to store the string literal only once and point all the variables to the same object.
Hence you see the id as identical.
In case 2, you are modifying
x
using concatenation. Bothx
andy
has same values, but not same identity.Both points to different objects in memory. Hence they have different
id
andis
operator returnedFalse