[英]Strange behaviour when assigning list value to key in dictionary in Python
我很难理解我在简单代码中做错了什么。 我找到了一个“解决方案”,但我想了解“为什么”:)
一般来说,我正在使用字典和列表进行简单的“分组”。
当我为键分配一个 2 元素列表的值时,该字典中的第一个元素(值)被分成两个单独的值,所有其他值都正常运行 - 是 2 元素列表。
所以在打印字典时我有 4 个值。
1301
425
['979', '340']
['1301', '977']
但是我能够将其修复为具有 3 对值 - 期望的结果:
['1301', '425']
['979', '340']
['1301', '977']
正如我所说,我能够使用.setdefault()
方法来解决这个问题,以分配简单分配的第一个元素,但我不明白为什么它会有所作为。
这是我的代码,class 的所有其他方面都正常工作或将在“未来”正常工作:):D
import os
import copy
from pathlib import Path
class ManageSettings:
def __init__(self, record_or_not = False,config_path = ".\\settings\\"):
self.to_record = record_or_not
self.ini_path = config_path + "\\position_settings.ini" # file path for settings
path_to_save = Path(config_path)
path_to_save.mkdir(exist_ok=True)
self.__position_list = {}
def save_or_load (self, sequence = 0):
if(self.to_record):
pass
else:
self.load_settings()
def save_settings(self, sequence = 0):
with open(self.ini_path, 'w') as file_writter:
for posXY in self.position_list:
file_writter.write("{};{};{}\n".format(sequence, posXY[0], posXY[1]))
def load_settings(self):
with open(self.ini_path, 'r') as file_reader:
sequence_dict = {}
for line_XY in file_reader:
sequence, posX, posY = line_XY.strip().split(";")
XYposList = list((posX, posY))
print(XYposList)
if not sequence in sequence_dict:
这是如果更改将打印不同结果的部分
# sequence_dict.setdefault(sequence,[]).append( XYposList)
sequence_dict[sequence] = XYposList
else:
sequence_dict[sequence].append( XYposList) # self.position_list = sequence_dict
print ('in class')
for values in sequence_dict.values():
print (values)
self.position_list = sequence_dict
@property
def position_list(self):
return self.__position_list
@position_list.setter
def position_list(self, position_list):
self.__position_list = position_list
这就是你如何简单地测试 class,当然如果你有 ini 文件:)
testClas = ManageSettings(False)
testClas.save_or_load()
print("outside the class")
for value in testKlas.position_list.values():
# print (len(value))
for test in value:
print (test)
编辑:嗨,这是ini文件的内容
0;1301;425
0;979;340
0;1301;977
这一行:
sequence_dict[sequence] = XYposList
应该:
sequence_dict[sequence] = [XYposList]
sequence_dict
中的值应该是二维列表。 但是当你创建第一个值时,你并没有把它放在一个列表中,你只是使用XYPostList
作为列表。 然后随后的append()
调用 append 到该列表。 所以你从
['1301', '425']
并且下一行将['979', '340']
附加到那个,导致
['1301', '425', ['979', '340']]
但是你想要的是初始值是:
[['1301', '425']]
然后它变成
[['1301', '425'], ['979', '340']]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.