在Python中将列表值分配给字典中的键时出现奇怪的行为

我很难理解我在简单代码中做错了什么。我找到了“解决方案”,但我想了解“为什么” :)
通常,我使用字典和列表来做一个简单的“分组依据”。
当我为键分配一个值为2个元素的列表时,该字典中的第一个元素(值)被分为两个单独的值,所有其他值均正常运行-为2个元素列表。

所以在打印字典时我有4个值。

1301
425
['979','340']
['1301','977']

但是我能够解决这个问题,使其具有3对值-理想的结果:

['1301','425']
['979','977']

正如我所说,我能够使用.setdefault()方法来解决此问题,并分配第一个进行简单分配的元素,但我不明白为什么会有所不同。
这是我的代码,该类的所有其他方面都正常工作,或者将在“未来”中正常工作:):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

这是您如何简单地测试类,当然,如果您有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
flh12004029 回答:在Python中将列表值分配给字典中的键时出现奇怪的行为

此行:

sequence_dict[sequence] = XYposList

应为:

sequence_dict[sequence] = [XYposList]

sequence_dict中的值应该是二维列表。但是,当您创建第一个值时,并没有将其放在列表中,而只是使用XYPostList作为列表。然后,随后的append()调用将追加到该列表。所以你开始

['1301','425']

,下一行将['979','340']附加到其后,结果

['1301','425',['979','340']]

但是您想要的是初始值:

[['1301','425']]

然后变成

[['1301','425'],'340']]
本文链接:https://www.f2er.com/3141767.html

大家都在问