返回顶部
首页 > 资讯 > 后端开发 > Python >python中类变量与成员变量的使用注意点总结
  • 292
分享到

python中类变量与成员变量的使用注意点总结

变量成员python 2022-06-04 18:06:27 292人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

前言

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

看下面的示例代码:


class A:
 x = 0
 def __init__(self):
 self.y = 0

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

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


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。

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


[] 0
[] 0
['1'] 1
['1'] 0
['1'] 0
['1'] 0

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

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

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

总结

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

--结束END--

本文标题: python中类变量与成员变量的使用注意点总结

本文链接: https://lsjlt.com/news/13354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中类变量与成员变量的使用注意点总结
    前言 最近在用python写一个项目,发现一个很恶心的bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解。后来联想到java的类有类变量也有实例变量,因此翻阅了相关资料,发现pyt...
    99+
    2022-06-04
    变量 成员 python
  • Python中变量的命名与使用(个人总结
    与众多编程语言一样,Python变量的命名有一定的规范: 变量名只能包含字母、数字、下划线且不能以数字开头。例如,num_1 为正确命名,而 1_num 则错误。 变量名不允许含空格,但是可以用下划线来分割单词。num_list 是可行...
    99+
    2023-01-31
    变量 Python
  • Shell中的变量使用总结
    本篇内容主要讲解“Shell中的变量使用总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Shell中的变量使用总结”吧!变量的定义,只能以字母和下划线开始,区分大小写,可以包含数字 字母下划线...
    99+
    2023-06-09
  • 深入了解Java中成员变量与局部变量的使用与区别
    目录一、成员变量和局部变量的区别二、封装private关键字private的使用this关键字一、成员变量和局部变量的区别 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方...
    99+
    2024-04-02
  • java内部类引用局部变量与外部类成员变量实例分析
    这篇“java内部类引用局部变量与外部类成员变量实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java内部类引用局部...
    99+
    2023-06-17
  • 在c++中什么是类的成员变量
    c++ 类成员变量存储在对象内存中,属于特定类,可以在类的定义中声明,并在声明时或使用构造函数初始化。它们可以使用点运算符(.)访问,可以是任何 c++ 数据类型。 C++ 中的类成员...
    99+
    2024-05-09
    c++
  • C++类的静态成员变量与静态成员函数详解
    目录1、类的静态成员变量2、静态成员函数总结1、类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成...
    99+
    2024-04-02
  • Python中闭包和自由变量的使用与注意事项
    目录1.定义2.nonlocal 关键字3.注意事项4.使用场景总结1.定义 在函数内部再定义一个函数,并且这个函数用到了外部函数的变量(LEGB),最后返回新建函数的函数名索引,那...
    99+
    2024-04-02
  • java中对象怎么调用成员变量与成员方法
    使用对象访问类中的成员:对象名.成员变量; 对象名.成员方法();成员变量的默认值:(免费学习视频教程分享:java视频教程)具体实例代码:public class StudentTest_01 { public static vo...
    99+
    2021-07-14
    java基础 java 对象 调用 成员变量 成员方法
  • Python中的变量类型标注怎么用
    这篇文章主要讲解了“Python中的变量类型标注怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的变量类型标注怎么用”吧!一、概述1、描述变量类型注解是用来对变量和函数的参...
    99+
    2023-07-06
  • 怎么理解C++类的静态成员变量与静态成员函数
    本篇内容介绍了“怎么理解C++类的静态成员变量与静态成员函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、类的静态成员变量C++类的静态...
    99+
    2023-06-25
  • Shell中的变量使用小结
    变量的定义,只能以字母和下划线开始,区分大小写,可以包含数字 字母下划线.详见官方手册 [root@svn shell_example]# yourname='Linux' [root@svn shel...
    99+
    2022-06-04
    小结 变量 Shell
  • Python的类成员变量默认初始值的坑及解决
    目录类成员变量默认初始值的坑问题发现示例代码结果原因解决方法Python默认值参数简单粗暴上代码可以用下面这种写法类成员变量默认初始值的坑 问题发现 一个循环内,缺省值初始化同名变量...
    99+
    2024-04-02
  • 深入了解Python中的变量类型标注
    目录一、概述1、描述2、常用的数据类型3、mypy模块二、使用1、基本使用2、函数参数返回值添加类型标注3、混合类型检查改进4、类型别名更改一、概述 1、描述 变量类型注解是用来对变...
    99+
    2023-05-15
    Python变量类型标注 Python 类型标注 Python标注
  • Python中闭包和自由变量的使用方法与注意事项是什么
    这篇文章主要为大家展示了“Python中闭包和自由变量的使用方法与注意事项是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中闭包和自由变量的使用方法与注意事项是什么”这篇文章吧。...
    99+
    2023-06-29
  • 浅析Golang中变量与常量的声明与使用
    目录变量变量的类型声明变量常量iota常见的使用iota的技巧变量 变量的类型 变量的作用是用来存储数据,不同的变量保存的数据类型有可能是不一样的,一般常见的数据类型有:整型、浮点型...
    99+
    2023-05-14
    Golang变量与常量声明 Golang变量 常量 Go 变量 常量
  • 怎么在go语言中初始化结构体的成员变量
    本篇文章给大家分享的是有关怎么在go语言中初始化结构体的成员变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。初始化方法:1、使用“ins := 结构体类型名{字段1:值,字段...
    99+
    2023-06-15
  • 变量与数据类型在 ASP 中的完美结合
    ...
    99+
    2024-04-02
  • Python的类成员变量默认初始值的坑及怎么解决
    这篇文章主要讲解了“Python的类成员变量默认初始值的坑及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类成员变量默认初始值的坑及怎么解决”吧!类成员变量默认初始值的...
    99+
    2023-06-29
  • Java中怎么使用构造方法对成员变量赋值
    在Java中,可以使用构造方法来对成员变量赋值。构造方法是一个特殊的方法,它与类名相同,没有返回类型,并且在创建对象时自动调用。下面是一个示例代码:```javapublic class Person {private String n...
    99+
    2023-08-11
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作