小能豆

为什么“is”运算符表示这些方法不一样?

py

考虑以下代码:

class Person(object):
   def sayHello(self):
       return 'Hello'

print(Person().sayHello is Person().sayHello)

我希望它显示 True。为什么它显示 False?


阅读 19

收藏
2024-11-12

共1个答案

小能豆

在 Python 中,当您访问实例上的方法时,每次都会创建一个新的绑定方法Person().sayHello对象。这意味着每次调用都会生成一个同时引用实例和方法的新绑定方法对象。因此,即使两个Person().sayHello表达式都引用类中的同一个方法,它们也是不同的对象,因此需要进行False比较is

下面分析一下为什么会发生这种情况:

  1. 方法绑定:每次访问时Person().sayHello都会绑定到的实例。因此,和是两个单独的绑定方法对象,即使它们引用的是的同一方法。Person``Person().sayHello``Person().sayHello``sayHello``Person
  2. is运算符is运算符检查对象身份。由于每次调用都会创建两个单独的绑定方法对象,因此Person().sayHello is Person().sayHello将是False

如何获取True

如果您想要进行比较True,您可以将实例存储在变量中以重用相同的绑定方法:

p = Person()
print(p.sayHello is p.sayHello)  # This will be True

在这种情况下,p.sayHello两次访问指的是同一个绑定方法对象,因为它是同一个实例(p),并且 Python 会针对这次重复的访问重用绑定方法对象。

2024-11-12