Python中if分支为何引用不同对象?如何实现同对象引用?
问题描述
请看以下代码:
def dayPress(self, number): var = TimeInput() if number == 0: print(var) elif number == 1: print(var)
TimeInput是一个Kivy对象,但这对当前问题无影响。
函数dayPress被调用两次,一次传入参数0,一次传入参数1。
输出结果如下:
第一次(传入0):<main.TimeInput object at 0x0000026E36261000>
第二次(传入1):<main.TimeInput object at 0x0000026E360A13F0>
观察两个对象的内存地址可知,它们是不同的对象。这不符合我的预期,我希望两次都引用同一个对象。
请问为何会引用不同对象?该如何修改?是不是因为我调用了两次函数,创建了两次var?
解答
原因分析
你说得完全正确——每次调用dayPress函数时,函数内部都会执行var = TimeInput()这行代码,这意味着每次调用都会新建一个TimeInput实例,所以两次调用得到的是不同的对象,内存地址自然不一样。函数内部的var是局部变量,每次函数调用结束后,这个变量的生命周期就会结束,下次调用会重新创建。
修改方案
要让两次调用都使用同一个TimeInput对象,你需要把对象的创建逻辑移到函数外部,由于你的函数是带self的类方法,最规范的做法是将其作为类的实例属性:
# 在类的初始化方法中创建一次TimeInput对象 def __init__(self, **kwargs): super().__init__(**kwargs) self.time_input = TimeInput() # 将对象存储为实例属性 def dayPress(self, number): if number == 0: print(self.time_input) elif number == 1: print(self.time_input)
这样,无论dayPress被调用多少次,都是引用同一个self.time_input对象,输出的内存地址会完全一致。
如果这个对象不需要和类实例绑定,也可以将其定义为模块级别的全局变量,但在Kivy的面向对象开发场景中,使用实例属性是更合理的选择。
内容的提问来源于stack exchange,提问作者Faruk Nergiz
相关产品推荐
相关产品推荐

