python类初始化参数赋值,实例直接调用append函数后,导致所有实例中变量改动
来源:互联网 发布:开店淘宝和天猫哪个好 编辑:程序博客网 时间:2024/06/06 10:54
问题描述
刚宿舍的问了个问题,简单的说就是编程遇到了如下的这种情况:
class Node(object): def __init__(self ,childrenList=[], name = '.' ): self.name = name self.childrenList = childrenLista = Node(name = 'wj')b = Node()a.childrenList.append(1)print(a.childrenList)print(b.childrenList)
输出如下:
[1][1]
原因
很奇怪,实例a的赋值,导致b中变量childrenList
也变了。
直觉上来说,应该是函数参数赋值是值传递还是引用传递的问题,当然本质上还是传的值,只是赋值对象是可变还是不可变的问题。
所以,来测试一下:
class Node(object): def __init__(self ,childrenList=[], name = '.' ): self.name = name self.childrenList = childrenList print("childrenList",id(self.childrenList)) print("name",id(self.name))a = Node(name = 'wj')b = Node()a.childrenList.append(1)print(a.childrenList)print(b.childrenList)
结果
childrenList 2754369477512name 2754369477232childrenList 2754369477512name 2754335175152
可以看到,name
字符串在两个实例中的内存位置不同,但childrenList
却是同一个,那就会出现1中的结果。
修改
最简单的可以直接使用self.childrenList=[]
赋值,这样的话就是用不到参数中的值。
更好一点的方法可以使用python的深拷贝。
import copyclass Node(object): def __init__(self ,childrenList=[], name = '.' ): self.name = name self.childrenList = copy.deepcopy(childrenList)a = Node(name = 'wj')b = Node()a.childrenList.append(1)print(a.childrenList)print(b.childrenList)
这样,生成的实例中childrenList
就会指向不同的单位。
阅读全文
0 0
- python类初始化参数赋值,实例直接调用append函数后,导致所有实例中变量改动
- 用__init__参数自动初始化实例变量
- 请教在block中如何给实例变量赋值?为什么block结束后实例变量又变为nil了呢
- python中初始化实例属性
- 函数变参数调用实例
- Python定义与调用函数、默认参数操作实例说明
- 静态方法不能直接调用实例方法和变量,但可以间接调用(即在静态方法中创建类的实例,然后调用)
- python变量命名、赋值、增量赋值操作实例
- C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别
- 静态函数调用类中实例函数
- C++中,全局阈只能声明、初始化变量; 不能用于赋值、运算、调用函数等
- 类变量、实例变量的初始化顺序
- 【转】类初始化中实例变量的执行顺序
- java中实例变量的初始化时机
- java中使用实例变量初始化器
- 多实例程序(Multiple Instance Application)中窗体调用 ShowDialog() 导致所有实例失去响应的问题, 及解决方案
- 处理block中调用对象实例变量导致的循环引用
- java实例变量初始化
- SVN 仓库使用教程
- selenum在指定元素上进行鼠标单击左键和释放的操作
- 在C++中输入字符串
- 拥抱变革——RSNA2017参会记录
- 编译器的结构(2)
- python类初始化参数赋值,实例直接调用append函数后,导致所有实例中变量改动
- android中WebView 显示不全的问题
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
- 图的邻接矩阵表示广度深度遍历大连理工大学数据结构上机
- idea 激活 pycharm激活
- 如何用Soft-NMS实现目标检测并提升准确率
- 160
- 如何保证Service不被杀死一直运行
- Netty