我有两个词典,我想结合两者的内容,以便以组合的方式处理它们。我做了以下
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.
我理解的一点是字符串是不可变类型。
我仍然希望能够引用旧字符串,并且对它们的更改必须反映在原始字符串中。
由于
答案 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
,这意味着它是一个可变的字符串集合,通过引用保存。您可以添加到列表中,也可以从列表中删除,但显然这对a
和b
没有影响。您也可以替换列表中的字符串,但这又对a
和b
没有影响。你不能修改"列表中的字符串,因为字符串是不可变的。
所以,你把自己画成了一个角落。您需要重新考虑代码的某些部分。例如,你可以创建一个包含字符串的小类,然后如果你存储该类的实例而不是实际的字符串,你将能够修改"他们通过交换对内部字符串的引用。额外的间接层。
答案 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中是不可变的。