You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:43:14