由于interning,两者之间通常没有区别(在结果对象中)。我们可以通过操作符检查两个变量是否指向同一个对象,与is
操作==
符检查对象的实际内存地址是否相同:
>>> a = "foo"
>>> b = a
>>> a is b
True
>>> c = a[:]
>>> a is c
True
实习是一种节省内存和加速不可变对象比较的机制,它的工作原理是这样的:在创建新的不可变对象之前,python 检查是否已经存在相同的不可变对象。如果是这样,它只使用对现有对象的引用。它可以做到这一点而不会造成伤害,因为没有办法改变不可变的。这就是为什么即使是两个独立创建的字符串也可能指向同一个对象:
>>> a = "foo"
>>> b = "foo"
>>> a is b
True
但是,如果var2
是一些可变的顺序对象,例如 a list
,那么var2[:]
将是 的浅拷贝var2
,因此对一个对象进行更改不会影响另一个对象。
>>> a = list("foo")
>>> a
['f', 'o', 'o']
>>> b = a
>>> b is a
True
>>> c = a[:]
>>> c is a
False
>>> b.pop()
'o'
>>> a
['f', 'o']
>>> b
['f', 'o']
>>> c
['f', 'o', 'o']
如需了解全貌,另请阅读 Ashwini Chaudharys 的回答。