为什么' a' +' bc'导致来自' abc'的不同(非)字符串

时间:2014-09-10 04:44:24

标签: python string

我试图弄清楚为什么以下' x'并且' y'是不同的。

>>> x = 'a' 
>>> x += 'bc'
>>> x
'abc'
>>> y = 'abc'
>>> x is y
False
>>>

>>> id(x)
4537718624
>>> id(y)
4537059288
>>>

为什么id与众不同?我不是在寻找关于'是'的信息。运营商。我试图弄清楚为什么连接后创建的新对象不同于' y'。

1 个答案:

答案 0 :(得分:4)

is指的是身份,就像对象的身份一样。 ==指的是相等,意味着两个(或相同的)对象具有相同的值。

如果我更改x的值,y的值不会改变,因为它们不是同一个对象,尽管它们具有相同的值。另一方面,如果我做了

x = [1, 2, 3]
y = x

然后更改某些内容,我将更改x和y指向的基础对象。这些是底层对象的标签(引用),而不是对象本身, identity value 不同。

编辑:

想象一下,我们创建了一个名为Person的类:

class Person(object):
    def __init__(name):
        self.name = name

世界上有不止一个“乔史密斯”。但他们不是同一个人。这在Python中也是如此:

joe1 = Person("Joe Smith")
joe2 = Person("Joe Smith")

他们的身份是不同的,因为他们是不同的对象,尽管它们具有相同的名称值。我们可以在它们上创建一个比较运算符来检查名称值是否相等,那么joe1 == joe2将为真,但joe1 is joe2将永远不会相同。

当您需要知道更改对象的状态是否会在其他地方产生影响时,Python的此功能非常有用。例如,如果我将字典传递给一个函数,并改变一些关于该字典的内容,它就会在任何地方都发生变化。这一点特别重要,因为Python通过值传递有时的函数参数,有时通过引用传递 ,这可能导致难以追踪错误(特别是如果你是新手Python)的:

>>> foo = {'bar': 'baz'}
>>> def changeit(z):
...     z['spam'] = 'eggs'
... 
>>> changeit(foo)
>>> foo
{'bar': 'baz', 'spam': 'eggs'}
>>> def changeit2(z):
...     if z is foo:
...         return "We don't want to mess with this, it affects global state."
...     else:
...         z['cro'] = 'magnon'
... 
>>> changeit2(foo)
"We don't want to mess with this, it affects global state."