繁体   English   中英

如何在 python 中正确导入字典以及如何修改导入的字典

[英]How to properly import dictionary in python and how to modify imported dictionary

我有一个名为 other.py 的文件

from src.data import users_stats
from datetime import timezone, datetime
first_timestamp = round(datetime.now().replace(tzinfo=timezone.utc).timestamp())

def clear_v1():
    users_stats.clear()
    users_stats = {'channels_exist': [{'num_channels_exist': 0, 'time_stamp': first_timestamp}],
                'dms_exist': [{'num_dms_exist': 0, 'time_stamp': first_timestamp}],
                'messages_exist': [{'num_messages_exist': 0, 'time_stamp': first_timestamp}]}

另一个名为 data.py 的文件

from datetime import timezone, datetime
first_timestamp = round(datetime.now().replace(tzinfo=timezone.utc).timestamp())
users_stats = {'channels_exist': [{'num_channels_exist': 0, 'time_stamp': first_timestamp}],
                'dms_exist': [{'num_dms_exist': 0, 'time_stamp': first_timestamp}],
                'messages_exist': [{'num_messages_exist': 0, 'time_stamp': first_timestamp}]}

我想用数据初始化字典(users_stats)(如data.py)。 当 clear_v1 被调用时,我希望字典(现在也填充了其他数据)到 go 回到最初的 state。

每当我调用 clear 时,它都会在分配之前表示引用,我认为程序认为我在分配之前调用了 users_stats.clear()。 但是从 data.py 导入的 users_stats 不是已经分配了吗?

我尝试删除行 users_stats.clear() 并添加全局 user_stats,但字典不会 go 回到最初的 state。

问题:如何使 data.py 中的 users_stats 回到 clear_v1() 中的初始 state?

编辑:抱歉没有提供有关该问题的更多详细信息。 我的文件夹结构如下:

📦project-backend
 ┣ 📂src
 ┃ ┣ 📜data.py
 ┃ ┗ 📜other.py
 ┗ 📂tests
 ┃ ┗ 📜testing.py

测试文件如下所示:

from src.data import users_stats
from src.other import clear_v1()

print(users_stats)
users_stats['messages_exist'][0] = 'changed'
print(users_stats)
clear_v1()
print(users_stats)

def clear_v1() 看起来像:

def clear_v1():
    users_stats = {'channels_exist': [{'num_channels_exist': 0,'time_stamp': first_timestamp}],
    'dms_exist': [{'num_dms_exist': 0, 'time_stamp': first_timestamp}],
    'messages_exist': [{'num_messages_exist': 0, 'time_stamp': first_timestamp}]}

它打印

{'channels_exist': [{'num_channels_exist': 0, 'time_stamp': 1618783441}], 'dms_exist': [{'num_dms_exist': 0, 'time_stamp': 1618783441}], 'messages_exist': [{'num_messages_exist': 0, 'time_stamp': 1618783441}]}
{'channels_exist': [{'num_channels_exist': 0, 'time_stamp': 1618783441}], 'dms_exist': [{'num_dms_exist': 0, 'time_stamp': 1618783441}], 'messages_exist': ['changed']}
{'channels_exist': [{'num_channels_exist': 0, 'time_stamp': 1618783441}], 'dms_exist': [{'num_dms_exist': 0, 'time_stamp': 1618783441}], 'messages_exist': ['changed']}

Edit2:我通过尝试与答案类似的事情来解决它

def clear_v1():
    first_timestamp = round(datetime.now().replace(tzinfo=timezone.utc).timestamp())
    og_users_stats = {'channels_exist': [{'num_channels_exist': 0, 'time_stamp': first_timestamp}],
              'dms_exist': [{'num_dms_exist': 0, 'time_stamp': first_timestamp}],
              'messages_exist': [{'num_messages_exist': 0, 'time_stamp': first_timestamp}]}   
    users_stats.clear()
    users_stats.update(og_users_stats)

我不确定您的问题是“分配前参考”。 如果您提供了堆栈跟踪,那将会很有帮助。 我的目录结构是:

lib
   src
      data.py

然后我将环境变量PYTHONPATH设置为指向目录lib 我的文件other.py是(或者您可以将other.py放在目录lib中):

from src.data import users_stats
from copy import deepcopy

save_users_stats = deepcopy(users_stats)

def clear_v1():
    users_stats.clear()
    users_stats.update(save_users_stats)

# change users_stats:
users_stats['messages_exist'][0] = 'changed'
# copy the reference:
d = users_stats
print(d)
clear_v1()
print(d)

印刷:

{'channels_exist': [{'num_channels_exist': 0, 'time_stamp': 1618730138}], 'dms_exist': [{'num_dms_exist': 0, 'time_stamp': 1618730138}], 'messages_exist': ['changed']}
{'channels_exist': [{'num_channels_exist': 0, 'time_stamp': 1618730138}], 'dms_exist': [{'num_dms_exist': 0, 'time_stamp': 1618730138}], 'messages_exist': [{'num_messages_exist': 0, 'time_stamp': 1618730138}]}

导入user_stats后, other.py使用deepcopy将字典的深层复制为save_user_stats 然后clear_v1清除并更新当前的user_stats字典,而不是为 user_stats 分配一个新的字典引用, user_stats user_stats的副本,在这种情况下,引用副本仍将指向修改后的字典。 如您所见,我从 function clear_v1引用users_stats没有问题。

笔记

您的代码清除users_stats字典,但随后将一个全新的字典重新分配给users_stats ,从而使您执行的清除操作完全多余。 此外,在我复制了users_stats字典d引用的示例代码中,在调用您的clear_v1之后,我的d现在将指向一个空字典。 通过我对clear_v1的实现,它仍然指向原始的clear_stats字典,该字典已简单地使用原始值进行了更新。 顺便说一句,完全有可能得到一份字典引用的副本。 你可以很容易地拥有一个 class ,它会被这个字典实例化,如下所示:

class MyClass:
    def __init__(self, users_stats):
        self._users_stats = users_stats # this is a copy of the reference

    ... #etc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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