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