在for循环中迭代更改字典是否安全?

时间:2020-06-02 13:09:33

标签: python python-3.x for-loop

我有一个定制的字典。每次访问字段时,它将重新加载整个词典。例如,我可能会有这样的循环:

my_dict=myDict('file.yml')

while(True):
    print(my_dict['field'])

如果我在运行时修改文件file.conf,这将更改输出。通过从collections.UserDict继承并按照this question中所述修改__getitem__来完成。简而言之,它看起来像这样:

class myDict(collections.UserDict):
    def __init__(self, filename):
        super().__init__()
        self.config_filename=filename
        self.reload()

    def __getitem__(self, key):
        self.reload() 
        return super().__getitem__(key)

    def reload(self):
        with open(self.config_filename) as f:
             data=yaml.safe_load(f)
        super().__init__(data)

我尝试了以下代码:

my_dict=myDict('file.yml')

for e in my_dict['test']:
    print(e)
    time.sleep(5)

在运行时,我修改了yaml文件,但没有任何效果,这正是我想要的。但是我确实想知道我能相信多少。我在这里的假设是,my_dict['test']在此for循环中将仅被访问一次,这意味着my_dict.__getitem__将仅被调用一次。这是正确的吗?

我还尝试过像这样修改循环中的值:

for e in my_dict['test']:
    print(e)
    print(my_dict['test'][e])
    my_dict['test']['me']='hehehehe'
    time.sleep(5)

同时,我还修改了文件,但所有更改均未显示在打印输出中。那么这是怎么回事?根据我的实验,似乎for循环等效于:

my_copy = copy.deepcopy(my_dict):
for e in my_copy:

但是认为这是安全的有风险。

0 个答案:

没有答案