网站首页 文章专栏 python 中使用字典遇到的指针坑
python 中使用字典遇到的指针坑
编辑时间:Aug. 28, 2018, 3:03 p.m. 作者:赵彦昌 浏览量:7176

你没有看错, 我说的是“指针”。 这好好的python ,不是说没有指针吗?怎么我字典赋值给一些变量,但改其中一个,结果其它被赋值同一个字典的变量,都跟着变了。

不知道我上面说的,你看明白了没有。如果没有,希望下面的代码可以帮你理解:


m = {"m": "I'm M"}
print(m)    #{'m': "I'm M"}

a = m
b = m
c = m

print(a, b, c) #({'m': "I'm M"}, {'m': "I'm M"}, {'m': "I'm M"})
# 修改字典m
m['m'] = "I'm F"
# 看到了吗?全变了!!!!
print(a, b, c)  #({'m': "I'm F"}, {'m': "I'm F"}, {'m': "I'm F"})

a['m'] = "I'm A"
print(a, b, c)  #({'m': "I'm A"}, {'m': "I'm A"}, {'m': "I'm A"})


伙伴们看明白了吗?    

       在python 中字典变量是以指针的形式存在的,如果你把一个字典变量m赋值给其它的变量a或b 或c,其实是把字典m的指针  指 的值的内存地址 赋值给了变量a 或 b 或 c, 为了让大家清楚的了解这一个现象,用代码来一遍最简单明了了:


# 接着使用上面的变量,做实验
print(id(a))    #139843967670856
print(id(b))    #139843967670856
print(id(c))    #139843967670856


可以看到,被字典变量m 赋值的三个变量 a, b , c 内存地址是相同的,所以不管你修改三个变量中的其中一个或字典m, 其它都会跟着变化。

好坑啊。我也是在做公司的数据统计时,有一段代码需要用字典去初始化一些变量。 可在测试时发现,数据是相同的。当时我就懵逼了。挠头,发呆,调试后发现数据就是最后一个被赋值的值。脱口一个胀话, 让我想起来,上学时用的C语言。后经过上面的实验。证实了我的想法,所以在这里记录一下,望能帮到遇到相同问题的道友

解决方案如下:

d  = m.copy()

就是这么简单, 原来人家有提供这个函数啊。现网上我查阅的PYTHON 基础教程里,没人提这个坑和用法。请入坑的同学自重



d

  



来说两句吧
最新评论