Python 列表与相等性

2 投票
4 回答
2990 浏览
提问于 2025-04-29 19:57

我正在为期中考试做准备,遇到了这个问题:

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 个回答

1

这两个答案都是正确的,但你也可以看看这个:

>>> a = []
>>> b = a
>>> a.append == b.append
True
1

在Python中,对列表进行切片操作总是会返回一个新的列表。比如说,the_cake[1:4]这个操作也会返回一个新的列表。所以,即使你每次都调用同样的切片,这并不意味着它会返回同一个列表。无论你重复调用同样的切片,每次调用时都会返回一个新的列表。

即使你把同样的切片 the_cake[1:4] 赋值给 a_lie,以及赋值给它自己(也就是 the_cake),这两个变量指向的都是不同的新列表。也就是说,这两个列表在创建时被分配了不同的内存位置。如果你检查 id(the_cake) == id(a_lie),结果会是 False

所以,当你对这两个实例调用添加元素的方法时,它们也是不同的。虽然调用的是同样的方法,但它们是从两个不同的实例中调用的。因此,调用 the_cake.appenda_lie.append 时,实际上是创建了不同的实例。

1

在Python 2.x中,类型对象的功能是根据对象在内存中的地址来实现丰富的比较。

而在Python 3.x中,要注意函数不再可以进行排序比较了。所以,比如说 the_cake.append > a_lie.append 这样的写法会报错。

2

这些方法和它们各自的对象实例在不同的位置。比如我们有:

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>

注意这些不同的地址。

撰写回答