Python:与#x27;是';和'==';?

Python:与#x27;是';和'==';?,python,Python,我正在尝试下一个代码: x = 'asd' y = 'asd' z = input() #write here string 'asd'. For Python 2.x use raw_input() x == y # True. x is y # True. x == z # True. x is z # False. 为什么上一个表达式中有false?is检查的不是对象是否相等,而是对象是否实际上是同一个对象。由于input() Python为同一字符串文本的所有引用创建一个对象,这就是为

我正在尝试下一个代码:

x = 'asd'
y = 'asd'
z = input() #write here string 'asd'. For Python 2.x use raw_input()
x == y # True.
x is y # True.
x == z # True.
x is z # False.

为什么上一个表达式中有false?

is
检查的不是对象是否相等,而是对象是否实际上是同一个对象。由于
input()


Python为同一字符串文本的所有引用创建一个对象,这就是为什么
x
y
指向同一个对象。

is
检查标识
a是b
is
True
iff
a
b
是相同的对象(它们都存储在相同的内存地址中)

=
检查相等性,这通常由神奇的方法
\uuuu eq\uuuu
-即
a==b
True
如果
a.\uu eq\uu(b)
为True


具体来说,Python将两个硬编码字符串优化到同一个对象中(因为字符串是不可变的,所以没有危险)。由于
input()
将在运行时创建一个字符串,它无法进行优化,因此创建了一个新的字符串对象。

对于小字符串部分:我不认为这是重复的。标题有误导性,但我认为它特别是关于为什么输入的字符串不一样。与另一个问题一样,它也不包含空格。问题可能略有不同,但答案是相同的--
is有时作为cpython中的实现细节起作用。事实上,投入并不是特别特别的;外卖应该是永远不要使用
is
。这正是我的初衷--input()将在运行时创建一个字符串x=5y=int(input())#我喜欢“it never
is