Python创建列表C=A+B,以便对C的更改影响A和B

Python创建列表C=A+B,以便对C的更改影响A和B,python,reference,Python,Reference,我不确定我所要求的是否可行,但如果可能的话,对于特定的应用程序来说是方便的。我正在为一个实验建立一个试验列表,在这个实验中,一个目标可以精确匹配一个素数,也可以是一个以特定方式与目标保持某种关系的不匹配。更明确地说,我所有的刺激都属于三级分类法,形式如下: H = { 'A1':{ 'B1':{ 'C1':[],'C2':[],'C3':[] }, 'B2':{ 'C1':[],'C2':[],'C3':[]

我不确定我所要求的是否可行,但如果可能的话,对于特定的应用程序来说是方便的。我正在为一个实验建立一个试验列表,在这个实验中,一个目标可以精确匹配一个素数,也可以是一个以特定方式与目标保持某种关系的不匹配。更明确地说,我所有的刺激都属于三级分类法,形式如下:

H = {
    'A1':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    },
    'A2':{
        'B1':{
            'C1':[],'C2':[],'C3':[] },
        'B2':{
            'C1':[],'C2':[],'C3':[] },
        'B3':{
            'C1':[],'C2':[],'C3':[] }
    }
}
树底部的每个列表都是一组特定的刺激。如果素数和目标匹配,这很简单。如果没有,我想从同一个B组下的不同C组中随机抽取,不需要替换

我想要的解决方案是利用我认为python处理引用的方式,并制作一个临时列表,我可以从中弹出一个刺激。因此,如果试验结果不一致,且素数来自H[A1][B1][C1],我想从列表中弹出:

tempList = H[A1][B1][C2] + H[A1][B1][C3]
然而,大概是因为我在附加两个列表,字典中对列表的引用被破坏了,所以如果我从临时列表中删除一个idem,它就不会反映在字典中。有没有办法维护参考资料?谢谢大家!

编辑: 此玩具示例未按预期工作:

>>> d = {'A':[1,2,3],'B':[4,5,6]}
>>> l = d['A'] + d['B']
>>> l
[1, 2, 3, 4, 5, 6]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5, 6]
>>> d
{'A': [1, 2, 3], 'B': [4, 5, 6]}

创建一个新类,该类接受H和初始值设定项中子列表的路径,并进行重写,以使基础列表受到影响

编辑:

部分示例:

class listxer(object):
  def __init__(self, structure, paths):
    self.structure = structure
    self.paths = paths

  def _descend(self, path):
    return reduce(lambda x,y: x[y], path, self.structure)

  def __len__(self):
    return sum(len(self._descend(path)) for path in self.paths)

  def __getitem__(self, item):
    if item < 0:
      raise ValueError('negative indices not supported!')
    for path in self.paths:
      cur = self._descend(path)
      if item > len(cur):
        item -= len(cur)
        continue
      else:
        return cur[item]
    else:
      raise IndexError('list index out of range')

H = [[[1, 2], [3, 4, 5]]]

mystruct = listxer(H, ((0, 0), (0, 1)))
print len(mystruct)
print mystruct[3]

虽然我很难给出一个专门的解决方案,但我会尽力回答你的问题

给定两个列表A和B,如何生成列表C,以便

如果C=A+B

改变C最终会改变A或B

以下面的例子为例

我创建了两个列表A和B,它们本身就是数字列表

>>> A=[[i] for i in range(0,10)]
>>> B=[[i] for i in range(10,20)]
然后我把它们加起来

>>> C=A+B
现在如果我改变C的任何元素,它会改变A或B


非常感谢您的快速回复/解决方案。不过,我想我需要一个示例来正确地构建类。对不起,我有很多东西要学。@Ignacio:请提供一个简短的例子,我也非常感谢。谢谢你的例子!我得花点时间在这上面。哦,我明白了关键的区别。您可以使用两个原始列表创建列表列表。这将正确维护引用。这可能很管用,但不像我喜欢的那么干净。我仍然有兴趣按照@Ignacio的建议构建一个新类
>>> C[1][0]=-1
>>> C
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19]]
>>> A
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9]]
>>> C[11][0]=-1
>>> C
[[0], [-1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [-1], [12], [13], [14], [15], [16], [17], [18], [19]]
>>> B
[[10], [-1], [12], [13], [14], [15], [16], [17], [18], [19]]
>>>