python中字典copy_python字典copy()方法

python 字典的copy()方法表面看就是深copy啊,明显独立

1 d = {'a':1, 'b':2}2 c =d.copy()3 print('d=%s c=%s' % (d, c))

Code1

结果:

d={'a': 1, 'b': 2}  c={'a': 1, 'b': 2}

修改d,看看c变化没有。

1 d['a']=3

2 print('d=%s c=%s' % (d, c))

Code2

结果:

d={'a': 3, 'b': 2}  c={'a': 3, 'b': 2}

这里仍然是相同的

再改:

1 d = {'b': 2, 'a': 3, 'c': ['a', 'c']}2 b =d.copy()3 print('d=%s b=%s' % (d, b))

Code3

1 d['c'] = ['a','c', 'shallow']2 print('d=%s b=%s' % (d, b))

Code4

code4 中重新对d['c']赋值了,发现结果是不相同的

d={'a': 3, 'c': ['a', 'c', 'shallow'], 'b': 2} b={'a': 3, 'c': ['a', 'c'], 'b': 2}

但是,这里的修改是重新赋值,如果直接对其进行修改呢?

1 d = {'b': 2, 'a': 3, 'c': ['a', 'c']}2 b =d.copy()3

4 d['c'].append(123)5 print('d=%s b=%s' % (d, b))

Code5

结果:

d={'b': 2, 'c': ['a', 'c', 123], 'a': 3} b={'b': 2, 'c': ['a', 'c', 123], 'a': 3}

发现两者并不是完全独立的,这就是“浅拷贝”的由来。

那么,问题来了:为什么对d重新赋值时c没有改变,而对d直接修改时c又改变了呢?

说到底还是python的机制问题,因为赋值操作都是在引用。

开始d,c引用同一个字典,当对d重新赋值后,c还指向原来的字典,但d引用已经改变,所以两都独立。

但是,当我在原字典的基础上直接修改c的value值(一个列表)。

此时d,c仍然那个字典,所以两者都改变了。

Python字典是一种非常常用的数据类型。当我们需要复制一个字典时,可以使用字典copy()方法或者内置函数dict()来实现。这两种方法都可以复制一个字典,但是它们的实现方式略有不同。 使用字典copy()方法,可以创建一个新的字典,该字典包含原始字典所有的键值对。这个新字典是原始字典的一个副本,但是它们是两个不同的对象,修改其一个字典不会影响另一个字典。例如: ``` dict_01 = {"name": "张三", "age": 20} dict_02 = dict_01.copy() print("dict_02:", dict_02) print("dict_01:", dict_01) dict_02["name"] = "李四" print("dict_02:", dict_02) print("dict_01:", dict_01) print("dict_01的引用:", id(dict_01)) print("dict_02的引用:", id(dict_02)) ``` 输出: ``` dict_02: {'name': '张三', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_02: {'name': '李四', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_01的引用: 4310921664 dict_02的引用: 4310921728 ``` 使用内置函数dict(),可以创建一个新的字典,该字典包含原始字典所有的键值对。这个新字典也是原始字典的一个副本,但是它们是两个不同的对象,修改其一个字典不会影响另一个字典。例如: ``` dict_01 = {"name": "张三", "age": 20} dict_02 = dict(dict_01) print("dict_02:", dict_02) print("dict_01:", dict_01) dict_02["name"] = "李四" print("dict_02:", dict_02) print("dict_01:", dict_01) print("dict_01的引用:", id(dict_01)) print("dict_02的引用:", id(dict_02)) ``` 输出: ``` dict_02: {'name': '张三', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_02: {'name': '李四', 'age': 20} dict_01: {'name': '张三', 'age': 20} dict_01的引用: 4302451136 dict_02的引用: 4303857856 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值