Python在没有明显原因的情况下更改变量



我对Python有一个奇怪的行为,可能很合理,但我不理解

def changeDict(status):
hotstatus = status
for e in hotstatus:
if hotstatus[e]:
hotstatus[e] = "Successful"
else:
hotstatus[e] = "Failed"
print(hotstatus)
message = f"""
Operation start: {hotstatus["operation-start"]}
Operation stop: {hotstatus["operation-stop"]}
"""
return message
def initalDict():
status = {}
status["operation-start"] = True
status["operation-stop"] = False
print(status)
message = changeDict(status)
print(message)
print(f"This is the status: {status}")
initalDict()

这个输出是如何产生的:

{'operation-start': True, 'operation-stop': False}
{'operation-start': 'Successful', 'operation-stop': 'Failed'}
Operation start: Successful
Operation stop: Failed

This is the status: {'operation-start': 'Successful', 'operation-stop': 'Failed'}

最后一行不应该读True和False作为值吗?我很困惑。如果有人能帮我解开这个谜,那就太好了:D。

问候

在Python中,dict是可变的,因此当您将一个分配给另一个变量时:

hotstatus = status  

它只是为底层的可变dict创建一个别名。修改由hotstatus别名为的dict,修改由变量名status引用的相同dict

如果你尝试这个:

import copy
... code ...
hotstatus = copy.deepcopy(status)  

您将对status所指的dict制作一个copy(实际上是一个深度副本,所有内容都将被复制,因此即使dict中存储了另一个可变内容,它的所有内容也将被复制(,因此hotstatus有自己的dict可供使用。对hotstatus的修改不会影响status所指的内容。

我看到您使用的是hotstatus=status。这使得它们都指向相同的存储位置。因此,当您更新一个字典时,它们都将被更新。

有关详细信息,请参阅此链接:此处

当您将字典status发送到函数changeDict()时,您将引用发送到status字典,而不是它的副本。

因此,更改changeDict()hotstatus的值将更改status字典,因为两者都指向同一对象。

您可以使用hotstatus = status.copy()来使用状态字典的副本。

这会让你对这个概念有一个清晰的认识。

当您执行hotstatus = status时,它不会创建字典输入的副本,您只是在更改名称,如果您想创建副本,则应使用hotstatus = status.copy(),然后您将能够在不更改状态的情况下编辑hotstatus

相关内容

最新更新