对python感到困惑的是运算符

对python感到困惑的是运算符,python,operators,Python,Operators,就在我以为我对python操作符了解得够多的时候 有人能解释为什么e是f吗 a = 'Goodbye' b = 'Goodbye' c = 'Good_Bye' d = 'Good_Bye' e = 'Good-Bye' f = 'Good-Bye' a is b Out[9]: True c is d Out[10]: True e is f Out[11]: False is检查两个对象中的任意一个 “is”运算符比较两个对象的标识;函数的作用是:返回一个表示其标识的整数 对于不可变的(例

就在我以为我对python操作符了解得够多的时候

有人能解释为什么e是f吗

a = 'Goodbye'
b = 'Goodbye'
c = 'Good_Bye'
d = 'Good_Bye'
e = 'Good-Bye'
f = 'Good-Bye'
a is b
Out[9]: True
c is d
Out[10]: True
e is f
Out[11]: False

is
检查两个对象中的任意一个

“is”运算符比较两个对象的标识;函数的作用是:返回一个表示其标识的整数

对于不可变的(例如,
str
)文本,相等的值可以(顺便说一句)实际依赖于支持它们的同一对象,但这不是保证或有意的->您不应该依赖于它(添加了强调):

类型几乎影响对象行为的所有方面。甚至对象标识的重要性在某种意义上也会受到影响:对于不可变类型,计算新值的操作可能实际返回对具有相同类型和值的任何现有对象的引用,而对于可变对象,这是不允许的。例如,a=1之后;b=1,a和b可能引用值为1的同一对象,也可能不引用值为1的同一对象,具体取决于实现


任何两个相同的字符串文字是否生成对单个共享对象或两个不同对象的引用取决于实现。这是否回答了您的问题@戈伦-不,事实上。。。我的问题非常具体,关于“再见”的价值。字符串中的“-”导致id不同。我认为您没有抓住重复的要点。CPython何时以及如何创建和存储字符串是一个具体的实现细节,与
“-”
无关,如果确实如此,它完全是您偶然发现的一个内部细节,对于CPython解释器的用户来说,这基本上是毫无意义的,在未来(或过去)版本中可能会发生变化。请仔细阅读整个复制链——执行
字符串是另一个字符串
从根本上说是不正确和不可预测的。@ggorlen-是的,我想我这里遗漏了一些东西。。。我明白你的意思。这就是为什么行为是一致的,它意味着不一致。让我来读你提到的那部分我明白了。。。“再见”的价值是什么。字符串中的“-”导致id不同。我明白了。这不是一个关于
如何是
操作符的问题,而是关于特定
str
文本的对象的问题。正如doc所说,它们的等值“可能相同,也可能不同”。这是由解释来决定的,但最重要的是,这是一种你不能依赖的行为,因为虽然它可能在你机器上特定版本的特定解释程序中以一种方式工作,但在任何地方和任何其他地方都不可能以同样的方式工作。顺便说一句。使用my解释器的特定示例的行为似乎还取决于它是否以交互方式运行(或从文件/或管道中运行)。