繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM