结合两个字典,仍然在python中引用原始对象

时间:2017-05-17 12:54:24

标签: python dictionary

我有两个词典,我想结合两者的内容,以便以组合的方式处理它们。我做了以下

a = {'one': 'fileone', 'two': 'filetow'}
b = {'three': 'filethree', 'four': 'filefour'}
clist = a.values() + b.values()

If I change anything in the clist, the change is not reflected in list a or b.

我理解的一点是字符串是不可变类型。

我仍然希望能够引用旧字符串,并且对它们的更改必须反映在原始字符串中。

由于

3 个答案:

答案 0 :(得分:1)

如果你用 可变的东西包裹你的字符串(确实是不可变的),你可以得到我认为你正在寻找的效果

a = {'one': ['fileone'], 'two': ['filetwo']}
b = {'three': ['filethree'], 'four': ['filefour']}

clist = a.values() + b.values()

print(clist)

a['one'][0] = 'different_file'

print(clist)

输出如下:

[['filetwo'], ['fileone'], ['filefour'], ['filethree']]
[['filetwo'], ['different_file'], ['filefour'], ['filethree']]

答案 1 :(得分:0)

正如您已经指出的那样,字符串是不可变的。您的clist是一个Python list,这意味着它是一个可变的字符串集合,通过引用保存。您可以添加到列表中,也可以从列表中删除,但显然这对ab没有影响。您也可以替换列表中的字符串,但这又对ab没有影响。你不能修改"列表中的字符串,因为字符串是不可变的。

所以,你把自己画成了一个角落。您需要重新考虑代码的某些部分。例如,你可以创建一个包含字符串的小类,然后如果你存储该类的实例而不是实际的字符串,你将能够修改"他们通过交换对内部字符串的引用。额外的间接层。

答案 2 :(得分:0)

您可以使用另一个值更新其中一个词。

a.update(b)

但是,a中的进一步更改仍未反映在b中。为了实现这一点,我想你最好创建自己的数据结构。

# Something on these lines

class MyDict(dict):
    def __init__(self, dict1, dict2):
        super(MyDict, self).__init__(dict1, dict2)
        self.dict1 = dict1
        self.dict2 = dict2

    def __getitem__(self, key):
        if key in self.dict1:
            return self.dict1[key]
        if key in self.dict2:
            return self.dict2[key]
        return super(MyDict, self).__getitem__(key)

    def __setitem__(self, key, value):
        if key in self.dict1:
            return self.dict1[key] = value
        elif key in self.dict2:
            return self.dict2[key] = value

        return super(MyDict, self).__setitem__(key, value)

现在,如果你想改变字符串,那是不可能的。字符串在Python中是不可变的。