Python:参考、字典和列表

Posted

技术标签:

【中文标题】Python:参考、字典和列表【英文标题】:Python: References, dictionaries and lists 【发布时间】:2018-12-26 03:27:10 【问题描述】:

我刚刚开始使用 Python 编写代码,但仍在使用引用以及它们在哪里使用和不使用。

我写了以下代码:

dummyList = self.getSprayLocation(heading, "left")
self.points['leftLeft'][0] = self.armLocations['leftX'] - self.mmToCoor(dummyList[0])
self.points['leftLeft'][1] = self.armLocations['leftY'] - self.mmToCoor(dummyList[1])
self.points['rightLeft'][0] = self.armLocations['leftX'] + self.mmToCoor(dummyList[0])
self.points['rightLeft'][1] = self.armLocations['leftY'] + self.mmToCoor(dummyList[1])
dummyList = self.getSprayLocation(heading, "mid")
print(self.points['leftLeft'][1])

self.points['leftMid'][0] = self.armLocations['midX'] - self.mmToCoor(dummyList[0])
self.points['leftMid'][1] = self.armLocations['midY'] - self.mmToCoor(dummyList[1])
self.points['rightMid'][0] = self.armLocations['midX'] + self.mmToCoor(dummyList[0])
self.points['rightMid'][1] = self.armLocations['midY'] + self.mmToCoor(dummyList[1])
print(self.points['leftLeft'][1])

dummyList = self.getSprayLocation(heading, "right")
self.points['leftRight'][0] = self.armLocations['rightX'] - self.mmToCoor(dummyList[0])
self.points['leftRight'][1] = self.armLocations['rightY'] - self.mmToCoor(dummyList[1])
self.points['rightRight'][0] = self.armLocations['rightX'] + self.mmToCoor(dummyList[0])
self.points['rightRight'][1] = self.armLocations['rightY'] + self.mmToCoor(dummyList[1])
print(self.points['leftLeft'][1])

它在一个类中,其中 'points' 是一个包含列表的字典:

coordinate = [0, 0]
points = 'leftLeft':coordinate, 'rightLeft':coordinate, 'leftMid':coordinate, 'rightMid':coordinate, 'leftRight':coordinate, 'rightRight':coordinate

请注意,在每个代码块之后,我都会打印 ['leftLeft'][0] 值。当我不写字典中的这个键时,我希望这个值不会改变。

但是当我运行这段代码时,这是输出

51.861101789
51.8611355556
51.8611192766

这意味着值已更改。事实上,所有“leftX”条目都是相同的,所有“rightX”条目都是相同的。

现在我认为这与参考有关,但我还没有提出解决方案。

感谢您的帮助!


编辑: 感谢 JoshuaF,我发现参考文献在

coordinate = [0, 0]
points = 'leftLeft':coordinate, 'rightLeft':coordinate, 'leftMid':coordinate, 'rightMid':coordinate, 'leftRight':coordinate, 'rightRight':coordinate

阻止。 “坐标”在任何地方都是相同的“坐标”。以下解决了这个问题:

coordinate = [0, 0]
points = 'leftLeft':coordinate[:], 'rightLeft':coordinate[:], 'leftMid':coordinate[:], 'rightMid':coordinate[:], 'leftRight':coordinate[:], 'rightRight':coordinate[:]

我知道 [:] 与引用和列表有关。但是什么?


meaning of [:] in python

Python copy manual

【问题讨论】:

somelist[:] 创建somelist 的浅拷贝。这是somelist[0:len(somelist)] 的快捷方式。 wrt/ "当引用被使用时",答案就在这里:nedbatchelder.com/text/names.html 谢谢!该网站上的解释非常好。 【参考方案1】:

正如所写,points 中的每个条目都指向同一个对象,coordinate。更改其中任何一个都将更改 coordinate 并因此更改所有其他。

【讨论】:

好的,知道了。但是用python的方式应该怎么做呢? docs.python.org/2/library/copy.html 或理解(即'leftleft': [c for c in coordinate])。 而且,如果你真的想确保避免这个错误,请将coordinate 设为一个元组,这样就无法直接修改。 谢谢,我将深入研究元组,并尝试了解它们及其行为。

以上是关于Python:参考、字典和列表的主要内容,如果未能解决你的问题,请参考以下文章

python中如何将两个列表组合成字典,并存放于一个新字典中

python内置数据类型列表list和字典dict的性能

Python列表,元组,字典,集合的比较总结【表格对比】

Python中的列表,元祖,集合,字典

使用while循环来处理列表和字典——参考Python编程从入门到实践

Python中列表和字典有啥区别,分别适用于啥