2

有点 Python 新手,但可以执行以下操作吗?

>>>random_dict=dict(a=2)
>>>addOnlyOneValue(random_dict)
{'a': 3}
>>>addOnlyOneValue(random_dict)
{'a': 3}

我做了什么:

def addOnlyOneValue(random_dict):
    random_dict2=random_dict     #I thought random_dict and random_dict2 would be modified independently    
    for val in random_dict2.keys():
        random_dict2[val]+=1
    print (random_dict2)

但如果我这样做,我会得到以下信息:

>>>random_dict=dict(a=2)
>>>addOnlyOneValue(random_dict)
{'a': 3}
>>>addOnlyOneValue(random_dict)
{'a': 4}

是否可以在 addOnlyOneValue 函数中以某种方式将 random_dict 重置为其原始值(此处为 random_dict=dict(a=2))?

4

2 回答 2

3

你想要做的是copy()字典:

random_dict2 = random_dict.copy()

在您的示例中,您只是random_dict2引用random_dict- 您想要创建一个具有相同值的新字典(请注意,这是一个浅拷贝,因此如果您的字典有可变项,新字典将指向那些物品仍然存在,这可能会导致看似奇怪的行为)。

请注意,您可以使用字典理解来执行此操作,而不是手动循环:

def addOnlyOneValue(random_dict):
    print({key: value+1 for key, value in random_dict.items()})

字典推导是通过修改现有数据结构中的值来创建新字典的最佳方式。

于 2012-11-26T18:19:29.853 回答
1

将字典(或除字符串或数字之外的任何其他对象)分配给另一个变量的结果是对该对象的引用的分配,它不会创建副本。你可能会这样做:

random_dict2 = dict(random_dict)

列表类似:

my_copy = list(some_list)

请注意,此副本是“浅”的,这意味着仅复制列表并将包含对所包含对象的引用,而不是对象的副本。阅读有关在 python 中复制的更多信息。

于 2012-11-26T18:25:39.977 回答