元组与python中的列表对象

时间:2010-11-11 19:19:03

标签: python

有人可以解释一下吗?

>>> [] is []
False
>>> () is ()
True
>>> (1,) is (1,)
False

我明白我应该使用“==”代替“是”来比较这些值,我只是想知道为什么会这样?

3 个答案:

答案 0 :(得分:10)

is基于对象标识。 I.E.,左右是同一个对象吗?

在所有这些情况下,对象通常会有所不同(因为你有六个单独的文字)。但是,由于依赖于实现的实习,空元组是同一个对象。如你所知,你永远不应该依赖这种行为。

请注意,可变对象无法实现,这意味着第一个必须为false。

答案 1 :(得分:3)

通过id进行比较时要小心。如果一个对象是GC,那么id可以被重用!

>>> id([])==id([])
True

甚至

>>> id([1,2,3])==id(["A","B","C"])
True

答案 2 :(得分:2)

以这种方式思考:在第一种情况下,对于像元组这样的不可变对象,如果它们是相同的,python实现可以安全地共享它们:

>>> a = ()
>>> b = ()
>>> a is b
True

现在考虑:

>>> a = []
>>> b = []
>>> a.append("foo")
>>> print a,b
['foo'] []

a和b不可能是同一个对象,因为修改a不应该修改b。

在最后一个例子中,你将回到不可变元组。 Python实现允许使它们成为相同的对象,但不是必需的,在这种情况下它不会(它基本上是一个空间/时间权衡 - 如果你使用了很多(在你的程序中,你可以节省内存,如果它们被实习,但是运行时需要花费运行时来确定任何给定的元组是否是可以共享对象的(1,)。