鱼C论坛

 找回密码
 立即注册
查看: 797|回复: 8

[已解决]为什么会有这样的不同?

[复制链接]
发表于 2019-6-23 18:22:56 | 显示全部楼层 |阅读模式
98鱼币
2.PNG 1.PNG
为什么会有这样的不同?
最佳答案
2019-6-23 18:22:57
如果你把第一个例子改为p1.name = ['小明'],结果就和第二个例子一样了。

因为用实例去修改不可变属性的时候,实质上是在实例中创建了一个name属性,在类中的属性并没有受影响。这也是一个作用域的问题。
反之如果你用Person.name来修改,那么就彻底的修改了。

还没理解可以参见:
https://www.cnblogs.com/scolia/p/5582268.html

最佳答案

查看完整内容

如果你把第一个例子改为p1.name = ['小明'],结果就和第二个例子一样了。 因为用实例去修改不可变属性的时候,实质上是在实例中创建了一个name属性,在类中的属性并没有受影响。这也是一个作用域的问题。 反之如果你用Person.name来修改,那么就彻底的修改了。 还没理解可以参见: https://www.cnblogs.com/scolia/p/5582268.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-23 18:22:57 | 显示全部楼层    本楼为最佳答案   
如果你把第一个例子改为p1.name = ['小明'],结果就和第二个例子一样了。

因为用实例去修改不可变属性的时候,实质上是在实例中创建了一个name属性,在类中的属性并没有受影响。这也是一个作用域的问题。
反之如果你用Person.name来修改,那么就彻底的修改了。

还没理解可以参见:
https://www.cnblogs.com/scolia/p/5582268.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-23 18:26:24 | 显示全部楼层
你没有定义实例属性,因此访问的都是类公共属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-23 19:49:20 | 显示全部楼层
newu 发表于 2019-6-23 18:58
如果你把第一个例子改为p1.name = ['小明'],结果就和第二个例子一样了。

因为用实例去修改不可变属性的 ...

3.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-23 20:23:58 | 显示全部楼层

初始代码:
  1. class Person:
  2.     name = ['初始']

  3. p1 = Person()
  4. p2 = Person()

  5. print(p1.name)
  6. print(p2.name)
  7. print(Person.name)
复制代码


验证:
  1. ===================== RESTART: D:\我的文件\Dsektop\test2.py =====================
  2. ['初始']
  3. ['初始']
  4. ['初始']
  5. >>> id(p1.name), id(p2.name), id(Person.name) # 初始实例因为都继承Person,所以内存地址都一样
  6. (59628240, 59628240, 59628240)
  7. >>> p1.name.append('修改') # 用append基础上修改发现内存地址不变
  8. >>> id(p1.name), id(p2.name), id(Person.name)
  9. (59628240, 59628240, 59628240)
  10. >>> Person.name = ['修改后']  #用这种方式直接修改类的属性,发现实例的引用地址随之改变
  11. >>> id(p1.name), id(p2.name), id(Person.name)
  12. (59683904, 59683904, 59683904)
  13. >>> p1.name = ['再修改'] #用实例地址发现只是改变了自己的属性,自己的地址发生了变化
  14. >>> id(p1.name), id(p2.name), id(Person.name)
  15. (59683784, 59683904, 59683904)
  16. >>>
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-23 20:27:45 | 显示全部楼层

谢谢你,非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-23 20:30:44 | 显示全部楼层
xhmjoy 发表于 2019-6-23 20:27
谢谢你,非常感谢!

不客气,同时我也在学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-23 21:17:51 | 显示全部楼层
塔利班 发表于 2019-6-23 18:26
你没有定义实例属性,因此访问的都是类公共属性

5.PNG 4.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-23 22:16:32 | 显示全部楼层

朋友你这个观察内存图的很不错诶,这个是什么软件啊,方便告知一下嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 17:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表