【发布时间】:2018-12-15 08:40:03
【问题描述】:
我是 Python 新手,不得不说 Python 处理变量赋值和函数参数的方式非常令人困惑。这是我不明白的事情。如果我定义了两个具有明确相同内容的字符串,例如“abc”,那么它们实际上是同一个对象,如下所示。
x = 'abc'
y = 'abc'
x is y
True
这让我想到 Python 是如何知道它们是相同的。通过比较代码中的文字?如果在 x = 'abc' 和 y = 'abc' 之间发生了数百万种不同的事情,Python 是否会一直返回并说已经有一个对象 'abc' 所以我不打算创建一个新的 'abc'?
我想知道如果我这样做但使用一个非常长且复杂的字符串会发生什么。这就是发生的事情。
x = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
y = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
x is y
False
x == y
True
现在你可以明白我为什么感到困惑了。所以 Python 在创建新字符串对象时只检查“简单”字符串而不检查长字符串?那么到底有多复杂/多长才算太复杂/长呢?
【问题讨论】:
-
这个细节是特定于实现的。 Python 允许实现共享它知道是不可变的任何值的实例,但从不需要它,因此任何依赖于
x is y或x is not y的代码在此处为 true 都会被破坏,或者充其量是不可移植的。如果您想了解特定实现的内部实现细节,例如 CPython 3.7、CPython 2.7 或 PyPy 2.1/3.5,或者如果您想大致了解 Python 实现可以在此处使用的含义,这些实际上都是单独的问题。
标签: python object variable-assignment