前言

最近在用python写一个项目,发现一个很恶心的bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解。后来联想到java的类有类变量也有实例变量,因此翻阅了相关资料,发现python也有类似的类变量和实例变量,下面来看看详细的介绍。

看下面的示例代码:

?

1

2

3

4

class A:

x= 0

def __init__(self):

self.y= 0

x就是类变量,y就是实例变量。

原则上是没有错的,但是实际用的时候就发现一些恶心的问题(也就是我找了三天的bug)。。。比如下面的代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class A:

x= []

y= 0

def __init__(self):

pass

def add(self):

self.x.append('1')

self.y+=1

a=A()

print a.x,a.y

print A.x,A.y

a.add()

print a.x,a.y

print A.x,A.y

b=A()

print b.x,b.y

print A.x,A.y

这里很明显x和y都是类变量,add的作用是分别对x和y做出修改。然后构造一个实例a,对实例a的值进行修改,最后构造实例b。

本以为这个结果是显而易见的,然而他输出的结果却是:

?

1

2

3

4

5

6

[]0

[]0

['1']1

['1']0

['1']0

['1']0

问题在哪?明明x和y都是类变量,在第二组print中为什么a.x和b.x一样,但是a.y和b.y就是不一样呢?

想了半天悟了一个道理。。。就是对于python来说,类变量的确是所有类共有的东西。但是那是在我们用的同一个引用的情况下,比如对于[]对象的append方法就是公用一个类变量了;但是对于赋值语句来说,如果在类中对类变量使用了赋值语句,那么python就会生成一个该对象的副本,以后的操作都是基于这个副本而不会对原来的类对象造成影响。这样就解释的通上面的现象了。

那么为了杜绝自己忘记类变量和实例变量的区别导致本不想公用变量的时候公用了变量,最好的办法就是在每个类中使用变量的时候重新初始化一下,这样就不会导致意外了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://blog.mythsman.com/2016/09/04/1/

python 类变量修改_python中类变量与成员变量的使用注意点总结相关推荐

  1. c++模板类静态成员变量_一文讲透父子类中静态变量,成员变量初始化顺序原理...

    推荐: 从面试到入职到离职,我在B站工作的30天时光 爱了爱了,Alibaba顶级MySQL调优手册到手,加薪妥了 爱了爱了,Spring Cloud Alibaba内部微服务架构笔记真的太牛了 本文 ...

  2. [转载] Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数

    参考链接: Python中的类或静态变量 原文地址:https://www.cnblogs.com/20150705-yilushangyouni-Jacksu/p/6238187.html Pyth ...

  3. java成员变量定义_java变量之成员变量和局部变量以及它们的运行机制

    Java语言根据变量定义位置的不同,将变量分为成员变量和局部变量.成员变量指的是定义在类中(方法外)的变量,局部变量指的是定义在方法中的变量.同时成员变量以是否用static修饰分为类变量和实例变量. ...

  4. java变量之全局变量(静态变量,成员变量),局部变量,的关系和区别

    转https://blog.csdn.net/m0_47616039/article/details/120452765 可能刚学java对这些变量很懵,直接上图,接下来进行代码解释 此文为了方便各位 ...

  5. java中静态变量和成员变量的区别

    java中静态变量和成员变量的区别 1.静态变量. 由static修饰的变量称为静态变量,其实质上就是一个全局变量.如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰:没有被静态修饰的内容,其 ...

  6. C#中变量(成员变量、局部变量、全局变量)的作用域

    不管在任何编程语言中都有变量的定义,变量就像是一个容器,不同的变量会在内存中占据不同大小的内存空间.定义变量后会将分配的地址绑定在这个变量名上,以后对该变量名的操作就是对该内存地上存储内容的操作. n ...

  7. 实例变量与成员变量的区别

    在Objective-C中,定义一个类,需要有两部分: 第一是接口(interface),第二是实现(implementation). 接口对应接口文件,而实现对应了实现文件. 接口文件包含了类的声明 ...

  8. python类变量继承_python 类的成员及继承

    1. @staticmethod 静态方法 静态方法不能访问实例变量和类变量,除了身处类里面,所以只能通过类调用以外,它其实和类没有什么关系.如果想要用它访问实例变量或类变量,需要把实例和类传递给函数 ...

  9. Python编程思想(26):成员变量

    李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法.读者可以在「极客起源」 公众号中输入 160 ...

最新文章

  1. 【直播】耿远昊:Pandas入门讲解(安泰第四届数据科学训练营)
  2. 帮AI体检看病一条龙服务,阿里发布“AI安全诊断大师”
  3. 梯度下降法Gradient Descent深度学习 机器学习
  4. 扩展系统功能——装饰模式
  5. linux mysql 最小安装,Linux最小化安装之安装mysql
  6. 缓存一致性协议MESI
  7. 宝塔面板 windows 2012 mysql 允许远程连接
  8. python中newfile是干嘛用的_Python基础介绍 | File I\O 读写文件
  9. 数据结构与算法python—9.二叉树及python实现
  10. 为什么建议要延迟macOS升级,小编为你全面分析!
  11. jquery里判断数组内是否包含了指定的值或元素的方法
  12. 依时利考勤机说明书_指纹考勤机如何安装及使用说明|依时利
  13. 动手学深度学习:6.3 语言模型数据集(周杰伦专辑歌词)
  14. 《30天自制操作系统》学习笔记--第0天
  15. 记录:seekbar进度条宽度和滑块高度一致问题
  16. 【机器学习】EM算法
  17. 轨迹规划 trajectory planning
  18. 【RAC】如何让Oracle RAC crs_stat 命令显示完整
  19. 公众号自定义菜单指定客服的简单操作
  20. Spring boot 启动后没反应

热门文章

  1. 模型花费几十万美元,五年之间指导无数项目,才发现负样本用的是null?
  2. 自然语言处理中的预训练技术发展史
  3. 神经网络七十年:回顾与展望
  4. 从经典问题开始教你如何入门计算机视觉!贴心!
  5. 漫画:什么是快速排序?(完整版)
  6. fastText实现文本分类
  7. 导致美国大范围网络瘫痪的Mirai僵尸网络
  8. 推荐 | Pair,医学图像标注神器
  9. 【OpenCV 4开发详解】直方图操作
  10. 94. 二叉树的中序遍历(迭代)