Python中类内__init__外定义类的变量

Python中类内定义类的变量中的bug

2018-12-5

今天看到有人在类内的初始化函数__init_(self,…)之前定义类的变量:
在这里插入图片描述
不是很明白为什么要在__init__()之外先定义一个变量x。于是就自己做实验测试了一下,之前定义的x=1和__init__()函数内的self.x=_x有何区别。
如下方式定义类A,
在这里插入图片描述
1. 内外变量虽然有相同的变量名,但分配不同地址
定义了A的对象a=A(1)
在这里插入图片描述
可以看到a.x是经过__init__()函数初始化过的对象的变量,而A.x是类A本身的变量,与对象a并无关系。
id()函数查看了变量的地址,a.xA.x的地址并不相同。

2. 当内外变量值一致时,可能会是相同地址
当我再次定义一个A的对象b,b=A(2),查看b.x的地址,发现id(b.x)=id(A.x)
在这里插入图片描述
如上面所显示的,b.x和A.x的地址竟然是一样的。
于是我又改变了b.x的值,
在这里插入图片描述
然后我又发现当我改变b.x的值为5,使其不等于A.x时,b.x的地址竟然又改变。
我就很不明白这是怎么一回事,后来在网上百度。看到其他网友关于id函数的解释:
在这里插入图片描述
引用链接:https://www.cnblogs.com/dplearning/p/5998112.html
也就是说,我们发现当a.x=A.x=2时,二者的内存是一样的,和类中变量的定义是无关的。只不过是python对于小型整数分配内存中的一种资源的共享。
然后,我就用大型的整数又做了一次实验:
在这里插入图片描述
a.x=b.x=A.x=1000,用id函数再次看三个变量的内存就发现它们是相互无关的。

就是这样了,以后还是可以放心大胆的在类内为类本身定义变量了。

猜你喜欢

转载自blog.csdn.net/weixin_39986952/article/details/84842567