我试图弄清楚为什么以下' x'并且' y'是不同的。
>>> x = 'a'
>>> x += 'bc'
>>> x
'abc'
>>> y = 'abc'
>>> x is y
False
>>>
>>> id(x)
4537718624
>>> id(y)
4537059288
>>>
为什么id与众不同?我不是在寻找关于'是'的信息。运营商。我试图弄清楚为什么连接后创建的新对象不同于' y'。
答案 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."