我是张帆小可爱 2023-05-31 10:56 采纳率: 76.9%
浏览 14
已结题

类的空间我还是不太能理解

最开始初始化的时候是将h赋给p的,此时p和h应该指向同一个对象。在进行循环的时,此时p的value变成了9,我认为此时h的value也应该变成9。最后一句p=h,最终输出的p的value却是0。这是为什么

img

img

  • 写回答

2条回答 默认 最新

  • smobee 2023-05-31 11:32
    关注

    在Python中,当你执行 p = h 时,它并不是将 h 赋值给 p,而是将 p 引用(reference)指向 h 引用指向的对象。这意味着 p 和 h 引用的是同一个对象。

    当你在循环中修改 p.value 时,实际上是修改了 p 引用的对象的属性值,而 h 引用仍然指向最初的对象,没有被修改。这是因为 p 和 h 引用的是同一个对象,它们共享相同的对象属性。

    在执行 p = h 时,p 引用的指向改变了,它不再指向原来的对象,而是指向 h 引用指向的对象。因此,在循环结束时,p 和 h 引用指向的是同一个对象,但是你最后的输出是 p.value,即当前 p 引用指向对象的属性值,因此输出的是最后一次循环中 p.value 的值。

    如果你希望将 h 的属性值赋给 p,你可以使用 p.value = h.value,这将会将 h 的属性值复制给 p 的属性值。

    下面是一个简单的示例来说明这个概念:

    
    class MyClass:
        def __init__(self, value):
            self.value = value
    
    h = MyClass(0)
    p = h
    
    for i in range(1, 10):
        p.value = i
    
    print(p.value)  # 输出:9
    print(h.value)  # 输出:9
    
    

    在上述示例中,p 和 h 引用的是同一个对象,因此它们的属性值都会被修改,并且最终输出的值都是 9。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 创建了问题 5月31日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊