Python 列表与相等性
我正在为期中考试做准备,遇到了这个问题:
the_cake = [1,2,[3],4,5]
a_lie = the_cake[1:4]
the_cake = the_cake[1:4]
great = a_lie
delicious = the_cake
moist = great[:-1]
在Python解释器中运行这段代码后,为什么会出现:
the_cake.append == a_lie.append
False
我认为它们是相等的方法,虽然不是用"IS"来比较,但应该能满足相等的条件。
也许因为实例化的原因,这个比较结果是False?如果是这样的话,类属性在比较时会返回True吗?这是列表对象的特殊情况吗?
后续问题:
根据这个链接: Python中的`==`和`is`有什么区别?
“如果两个变量指向同一个对象,IS会返回True;如果变量所指向的对象相等,则==会返回True。”
那么,列表类的方法是指向不同的“append”方法实例吗?
所以如果我定义一个函数x(parameter),每次调用它时,它都是一样的,因为它是分配给不同变量的同一个对象,对吧?
那么对于某个等价的变量“parameter”:
x(parameter) == x(parameter)
True
谢谢!
4 个回答
这两个答案都是正确的,但你也可以看看这个:
>>> a = []
>>> b = a
>>> a.append == b.append
True
在Python中,对列表进行切片操作总是会返回一个新的列表。比如说,the_cake[1:4]
这个操作也会返回一个新的列表。所以,即使你每次都调用同样的切片,这并不意味着它会返回同一个列表。无论你重复调用同样的切片,每次调用时都会返回一个新的列表。
即使你把同样的切片 the_cake[1:4]
赋值给 a_lie
,以及赋值给它自己(也就是 the_cake
),这两个变量指向的都是不同的新列表。也就是说,这两个列表在创建时被分配了不同的内存位置。如果你检查 id(the_cake) == id(a_lie)
,结果会是 False
。
所以,当你对这两个实例调用添加元素的方法时,它们也是不同的。虽然调用的是同样的方法,但它们是从两个不同的实例中调用的。因此,调用 the_cake.append
和 a_lie.append
时,实际上是创建了不同的实例。
在Python 2.x中,类型对象的功能是根据对象在内存中的地址来实现丰富的比较。
而在Python 3.x中,要注意函数不再可以进行排序比较了。所以,比如说 the_cake.append > a_lie.append
这样的写法会报错。
这些方法和它们各自的对象实例在不同的位置。比如我们有:
a = []
b = []
所以我们有:
>>> a.append == b.append
False
它们各自的位置在:
>>> a.append
<built-in method append of list object at 0x7f7c7c97d560>
>>> b.append
<built-in method append of list object at 0x7f7c7c97d908>
注意这些不同的地址。