可变对象,不可变对象
Posted cdcc1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变对象,不可变对象相关的知识,希望对你有一定的参考价值。
不可变对象为字符串,元组等
可变对象为列表,字典,集合等。
浅拷贝只是对已经存在的内存新增加一个对象引用。,
深拷贝就是重新申请一个新的内存,使这个是新对象是新内存地址的引用。
对于可变对象引用时时经常出现。
考虑以下两段代码:
代码1
l = [] for i in range(10): l.append({‘num‘:i}) print(l) 结果: [{‘num‘: 0}, {‘num‘: 1}, {‘num‘: 2}, {‘num‘: 3}, {‘num‘: 4}, {‘num‘: 5}, {‘num‘: 6}, {‘num‘: 7}, {‘num‘: 8}, {‘num‘: 9}]
代码2
l = [] a = {‘num‘:0} for i in range(10): a[‘num‘] = i l.append(a) print(l) print(‘id(l[0]) : ‘,id(l[0]),‘ id(l[1]) : ‘,id(l[1])) 结果: [{‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}, {‘num‘: 9}] id(l[0]) : 4542112 id(l[1]) : 4542112
结论:
代码1中l.append中新添加的对象为新创建的对象,
代码2中l.append中新添加的对象为字典a,即 l[new] = a, l[new] 为a所指向内存地址的一个新引用,所有的 l[new] 都指向同一个内存地址。而字典a为可变对象,后面a的发生改变时,即所在内存地址内数据发生改变。,
以上是关于可变对象,不可变对象的主要内容,如果未能解决你的问题,请参考以下文章