鱼C论坛

 找回密码
 立即注册
查看: 445|回复: 3

[已解决]列表中的对象属性改变问题

[复制链接]
发表于 2019-7-16 00:27:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码运行后为什么输出是12  不是0   
  1. class point():
  2.     x = 0
  3.     y = 0
  4.     def __init__(self, x=0, y=0):
  5.         self.x = x
  6.         self.y = y
  7. points = [point]*6
  8. points[0].x = 12
  9. print(points[1].x)
  10. print(points[2].x)
  11. print(points[3].x)
复制代码

要单独修改列表中的对象的属性怎么办?
最佳答案
2019-7-16 03:09:59
  1. points = [point]*6
复制代码

这句并非实例化类

可以这样:

  1. class Point:
  2.     x = 0
  3.     y = 0

  4.     def __init__(self, x=0, y=0):
  5.         self.x = x
  6.         self.y = y


  7. points = []

  8. for i in range(6):
  9.     locals()[f'a{i}'] = Point()
  10.     points.append(locals()[f'a{i}'])

  11. points[0].x = 12
  12. print(points[0].x)
  13. print(points[1].x)
  14. print(points[2].x)
  15. print(points[3].x)
复制代码


我赶脚还是实例化才对

另外提个建议,类名首字母大写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-7-16 03:09:59 | 显示全部楼层    本楼为最佳答案   
  1. points = [point]*6
复制代码

这句并非实例化类

可以这样:

  1. class Point:
  2.     x = 0
  3.     y = 0

  4.     def __init__(self, x=0, y=0):
  5.         self.x = x
  6.         self.y = y


  7. points = []

  8. for i in range(6):
  9.     locals()[f'a{i}'] = Point()
  10.     points.append(locals()[f'a{i}'])

  11. points[0].x = 12
  12. print(points[0].x)
  13. print(points[1].x)
  14. print(points[2].x)
  15. print(points[3].x)
复制代码


我赶脚还是实例化才对

另外提个建议,类名首字母大写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2019-7-16 13:23:35 | 显示全部楼层
还是不知道是咋实例化的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-7-17 17:57:56 | 显示全部楼层
本帖最后由 fallout.nj 于 2019-7-17 22:39 编辑
wzy1986 发表于 2019-7-16 13:23
还是不知道是咋实例化的


老哥,其实实例化对象很简单,我之前也纠结了很久,现在用你的代码做例子说说我的理解

  1. class Point():
  2.     x = 1
  3.     y = 2

  4.     def __init__(self, x=3, y=4):
  5.         self.x = x
  6.         self.y = y


  7. # points = [point]*6
  8. points = []

  9. for i in range(6):
  10.     points.append(Point())
  11. points[0].x = 12
  12. print(points[1].x)
  13. print(points[2].x)
  14. print(points[3].x)
复制代码


发现问题了吗?其实Point带上括号就是实例化,上面这段代码只是单纯的将Point()放入points例表里6次,但是这列表里的每个元素的地址都不一样的,也就是他们都实例化了!

例如我之前给你的回复的代码意思是说每个实例化都给了个名字,a0,a1,a2...a5,然后再把a0-a5放到列表里而已P

那问题来了,如果将这个代码
  1. for i in range(6):
  2.     points.append(Point())
复制代码

变成下面这个代码
  1. for i in range(6):
  2.     points.append(Point)
复制代码

那结果会怎样?

很显然,结果就都会变成12了,而且你会发现,points列表里的每个元素都指向同一个内存地址!这就是没有实例化!调用没有实例化的类的属性,例如Point.x 它的值就是1

举个例子,上面的代码里,如果没有
  1. points[0].x = 12
复制代码
这句的时候,points[0].x的值会等于1,那是因为class内,函数外面的变量都是类的内部变量,在实例化以后x和y就没用了(或者也可以说x和y是你封装在Point类内的常量)!

不知道你能理解不,当时我也是因为类内变量的作用域而苦恼不已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-5-25 16:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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