我对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