Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字典对邻居字典元素的引用_Python_Dictionary - Fatal编程技术网

Python字典对邻居字典元素的引用

Python字典对邻居字典元素的引用,python,dictionary,Python,Dictionary,我正在尝试创建以下内容: dictionary = { 'key1': ['val1','val2'], 'key2': @key1 } 其中@key1是对字典['key1']的引用。 提前感谢您。使用新课程: class DictRef(object): def __init__(self, d, key): self.d, self.key = d, key d = {} d.update({ 'key1': ['val1','val2'], 'key

我正在尝试创建以下内容:

dictionary = {
   'key1': ['val1','val2'],
   'key2': @key1
}
其中@key1是对字典['key1']的引用。 提前感谢您。

使用新课程:

class DictRef(object):
    def __init__(self, d, key): self.d, self.key = d, key

d = {}
d.update({
    'key1': ['val1','val2'],
    'key2': DictRef(d, 'key1')
})

请注意奇怪的语法,因为您无法知道要在哪个词典中创建
DictRef

我将扩展Aaron Digulla的版本。他现在所拥有的在这里复制:

class DictRef(object):
    def __init__(self, d, key): self.d, self.key = d, key

d = {}
d.update({
    'key1': ['val1','val2'],
    'key2': DictRef(d, 'key1')
})
我假设他希望复制真正的引用语义,因此访问
'key2'
将始终为您提供一种方法,以获取
'key1'
作为值的任何内容。问题在于
d['key1']
是一个
列表
d['key2']
是一个
DictRef
。因此,要获得
'key1'
的“值”,您只需执行
d['key1']
,但对于
'key2'
您必须执行
d[d['key2'].key]
。此外,您不能拥有对正常工作的引用的引用,它将成为
d[d[key2'].key].key]
。如何区分引用值和常规值?可能是通过使用isinstance(v,DictReference)()进行类型检查

所以我有一个解决所有这些问题的建议

就我个人而言,我不明白为什么真正的引用语义是必要的。如果它们看起来是必要的,可以通过重组问题或问题的解决方案使它们变得不必要。甚至可能根本不需要它们,一个简单的
d.update(key2=d['key1'])
就可以解决这个问题

无论如何,对于该提议:

class DictRef(object):
    def __init__(self, d, key): 
        self.d = d
        self.key = key

    def value(self):
        return self.d[self.key].value()

class DictVal(object):
    def __init__(self, value):
        self._value = value

    def value(self):
        return self._value

d = {}
d.update(
    key1=DictVal(['val1', 'val2']),
    key2=DictRef(d, 'key1')
)

现在,为了获得任何键的值,不管它是否是引用,只需执行
d[k].value()
。如果存在对引用的引用,它们将在链中正确地取消引用。如果它们形成一个非常长或无限长的链,Python将因过度递归而出现运行时错误而失败。

好吧,既然不引用d是不可能的,我们不妨执行
d={'key1':[…]};d、 更新({'key2':d['key2']})
。如果执行类似于
字典['key1']=4的操作,会发生什么?键2应该包含4,还是仍然引用原始列表?与此问题类似,尽管后来发布: