返回顶部
首页 > 资讯 > 后端开发 > Python >Python的类成员变量默认初始值的坑及怎么解决
  • 430
分享到

Python的类成员变量默认初始值的坑及怎么解决

2023-06-29 03:06:41 430人浏览 八月长安

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

摘要

这篇文章主要讲解了“python的类成员变量默认初始值的坑及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类成员变量默认初始值的坑及怎么解决”吧!类成员变量默认初始值的

这篇文章主要讲解了“python的类成员变量默认初始值的坑及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类成员变量默认初始值的坑及怎么解决”吧!

类成员变量默认初始值的坑

问题发现

一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值。

示例代码

# Define classclass Variant():    # use    def __init__(self, price = 500, description = 'default description', values = ['', '', '']):        self.price = price        self.description = description        self.values = values        def __str__(self):        return 'price: {}, description: {}, values: {}'.fORMat(self.price, self.description, self.values)variant_list = []# Create instance with same name iterativelyfor i in range(3):    current_variant = Variant()    if i == 1:        current_variant.values[2] = 'hello'    current_variant.price = i    current_variant.description = 'description of variant: {}'.format(i)    variant_list.append(current_variant)    # Test resultsfor variant in variant_list:    print(str(variant))

结果

所有实例的values列表值相同

原因

可选参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候”如此使用缺省值初始化,list成员指向的是同一个list(地址),如果只是修改其中一个元素(而不是赋值新的list开辟新内存),那么所有instance的list成员都会被修改。

解决方法

直接在构造方法中置为空(self.values = ['', '', '']),之后各个修改值

Python默认值参数

简单粗暴上代码

def fun(a, b=[]):    b += [a]    print(b)fun(1)fun(2,[])fun(3)

是不是看上去很简单,其实暗藏玄机,请大家看一下输出结果,是不是有点让你疑惑^^~

[1]
[2]
[1, 3]

此时你是否也和我有一样的疑惑,为什么 fun(3) 的输出结果是 [1, 3]?

哈哈,不卖关子了,这里是因为,因为函数被定义好后,只会生成一次,所以在函数生成的时候定义的变量 b 的默认值也只会被初始化一次。

因此,当执行fun(1)函数时,没有给 b 传参,所以使用的是 b 的默认值,此时 b 的默认值为[1]。

执行fun(2,[])时,给 b 传了一个[]值(恰好和默认值相同,其实是不同的数据),因此便使用的是传入数据,执行结果便是[2]。

然后在执行fun(3),此刻又没有给 b 传参,所以依旧使用的是 b 的默认值, 而 b 的默认值只会随着函数的生成被生成一次 ( fun(1) 生成过了 ),所以现在的默认值是fun(1)的执行结果[1],因此当fun(3)再次调用时,输出结果便会是[1, 3]。

如果不行出现当前这种情况,而是在函数每次被调用的时候都初始化一次变量

可以用下面这种写法

def function(a, b=None):    b = b if b else []  # 明确每次重新定义b    b += [a]    print(b)function(1)function(2, [])function(3)

输出结果:

[1]
[2]
[3]

感谢各位的阅读,以上就是“Python的类成员变量默认初始值的坑及怎么解决”的内容了,经过本文的学习后,相信大家对Python的类成员变量默认初始值的坑及怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Python的类成员变量默认初始值的坑及怎么解决

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

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

猜你喜欢
  • Python的类成员变量默认初始值的坑及解决
    目录类成员变量默认初始值的坑问题发现示例代码结果原因解决方法Python默认值参数简单粗暴上代码可以用下面这种写法类成员变量默认初始值的坑 问题发现 一个循环内,缺省值初始化同名变量...
    99+
    2024-04-02
  • Python的类成员变量默认初始值的坑及怎么解决
    这篇文章主要讲解了“Python的类成员变量默认初始值的坑及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类成员变量默认初始值的坑及怎么解决”吧!类成员变量默认初始值的...
    99+
    2023-06-29
  • Java未赋值变量的初始值解析(默认值)
    目录Java未赋值变量的初始值(默认值)初始值(默认值)实例变量(非静态字段)类变量(静态字段)本地变量参数解决java未赋值变量的默认值问题如下所示Java未赋值变量的初始值(默认...
    99+
    2024-04-02
  • 基于java变量和作用域以及成员变量默认初始化的示例分析
    这篇文章主要为大家展示了“基于java变量和作用域以及成员变量默认初始化的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于java变量和作用域以及成员变量默认初始化的示例分析”这篇文章...
    99+
    2023-05-30
    java
  • Java类变量和成员变量初始化的过程
    这篇文章主要讲解了“Java类变量和成员变量初始化的过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类变量和成员变量初始化的过程”吧!一、类的初始化对于类的初始化:类的初始化一般只...
    99+
    2023-06-17
  • 聊聊java变量的初始化之后的默认值
    变量初始化后的默认值 对于类的成员变量 不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值。 1、整数类型(byte、short、int、long)的基本类型变...
    99+
    2024-04-02
  • Java八种基本变量作为类的成员变量的默认值操作
    目录Java类成员变量的默认值下面我们看看我们的八种数据类型的默认值是什么样的总结boolean型变量的默认值问题1、首先分析Java中的三种不同变量的区别2、然后判断boolean...
    99+
    2024-04-02
  • MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
    目录LambdaQueryWrapper使用 int默认值问题问题现象解决方法问题分析小结一下lambdaquerywrapper in使用样例直接使用列名报错下面这样okLambd...
    99+
    2024-04-02
  • C++中类的默认成员函数怎么用
    这篇文章主要介绍了C++中类的默认成员函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声...
    99+
    2023-06-29
  • 怎么在go语言中初始化结构体的成员变量
    本篇文章给大家分享的是有关怎么在go语言中初始化结构体的成员变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。初始化方法:1、使用“ins := 结构体类型名{字段1:值,字段...
    99+
    2023-06-15
  • MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决方法是什么
    本篇文章给大家分享的是有关MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决方法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧...
    99+
    2023-06-26
  • c++中类的构造函数可以初始化静态成员变量吗
    c++ 中类的构造函数可以初始化静态成员变量。初始化语法如下:在构造函数中使用 staticmembervariable = ...; 声明。静态成员变量仅在第一次执行构造函数时初始化一...
    99+
    2024-05-09
    c++
  • 浅谈python中的变量默认是什么类型
    1、type(变量名),输出的结果就是变量的类型; 例如 >>> type(6) <type 'int'> 2、在Python里面变量在声明时,不需要指定变量的类型,变量的类型...
    99+
    2022-06-04
    浅谈 变量 类型
  • 分配给用户变量的位值的默认类型是什么?
    默认情况下,分配给用户变量的位值是二进制字符串。可以通过将位值分配给用户变量然后按如下方式检索它们来说明 -mysql> SET @abc = 0b1000011; Query OK, 0 rows affected (0.00 se...
    99+
    2023-10-22
  • 怎么理解C++类的静态成员变量与静态成员函数
    本篇内容介绍了“怎么理解C++类的静态成员变量与静态成员函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、类的静态成员变量C++类的静态...
    99+
    2023-06-25
  • python怎么修改类变量的值
    这篇文章主要介绍“python怎么修改类变量的值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python怎么修改类变量的值”文章能帮助大家解决问题。通过类对象是无法修改类变量的值的,本质其实是给类...
    99+
    2023-06-30
  • java实体类怎么设置默认值的注解
    在Java中,可以使用注解来设置实体类的默认值。下面是一个示例:```javapublic class Entity {@Defau...
    99+
    2023-09-11
    java
  • C++分析讲解类的静态成员变量是什么
    目录一、成员变量的回顾二、新的需求三、静态成员变量四、小结一、成员变量的回顾 通过对象名能够访问 public 成员变量每个对象的成员变量都是专属的成员变量不能在对象之间共享 二、新...
    99+
    2024-04-02
  • 怎么理解C++的静态成员变量和静态成员函数
    怎么理解C++的静态成员变量和静态成员函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.static修饰变量void text() {static&nb...
    99+
    2023-06-22
  • MyBatisPlus不使用数据库默认值的问题怎么解决
    这篇“MyBatisPlus不使用数据库默认值的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatisPl...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作