Python 字典一个易犯的错误
2024-08-31 23:05:18
一个易犯的错误,关于 Python 的传值(对于不可变量) 和 传引用(对于可变量),浅拷贝和深拷贝。废话不多说,看例子,
直接改变可变字典值,失败,
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> dic[0]
[]
>>> dic[0].append(123)
>>> dic
{0: [123], 1: [123], 2: [123], 3: [123], 4: [123]}
>>>
间接改变可变字典值,失败。
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0]
>>> v
[]
>>> v.append(123)
>>> v
[123]
>>> dic
{0: [123], 1: [123], 2: [123], 3: [123], 4: [123]}
切片浅拷贝,对于非嵌套可变字典值,赋单值,成功,
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0][:]
>>> v
[]
>>> v.append(123)
>>> v
[123]
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> dic[0] = v
>>> dic
{0: [123], 1: [], 2: [], 3: [], 4: []}
切片浅拷贝,对于非嵌套可变字典值,赋可变列表,成功,
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0][:]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}
copy.copy 浅拷贝,成功,
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> v = copy.copy(dic[0]) # shallow copy
>>> v
[]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}
>>>
copy.deepcopy 深拷贝,成功,这个最靠谱。
>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> v = copy.deepcopy(dic[0])
>>> v
[]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}
>>>
完。
最新文章
- 53. 特殊的O(n)时间排序[sort ages with hashtable]
- getComputedStyle的应用
- C++的友元类和友元函数实例
- 关于HttpURLConnection.setFollowRedirects
- php删除指定目录所有文件
- Python特殊语法:filter、map、reduce、lambda [转]
- 遍历JObject
- Windows Phone开发-开发环境和结构
- 【HDU1394】Minimum Inversion Number(线段树)
- hdu4190 简单的二分法
- viim命令行模式查找替换
- epoll通俗讲解
- IDEA项目搭建六——使用Eureka和Ribbon进行项目服务化
- BZOJ1024:[SCOI2009]生日快乐(DFS)
- [转载]转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
- FBX SDK在vs 2010下面的配置
- 【LeetCode】数组移除元素
- HIVE点滴:group by和distinct语句的执行顺序
- ret和retf
- python 正则表达式替换字符串中匹配的字符