如何引用dict对象?

时间:2017-05-26 15:17:46

标签: python variables dictionary reference

我有一个Python dict对象dd = {'a': 1, 'b': 2, 'c': 3}。我的问题很简单。我想将变量引用到d的元素。例如,像:

In[1]: p = d['a']
>>> p = 1
In[2]: p = 2
In[3]: d
>>> d = {'a': 2, 'b': 2, 'c': 3}

这甚至可能吗?但据我所知dict对象是可变的。

3 个答案:

答案 0 :(得分:6)

正如其他人所指出的,这在Python中确实不可能,它没有C ++样式引用。你可以得到的最接近的是你的字典值是否可变,然后你可以在外面改变它,它将被反映在字典中(因为你正在改变与存储在字典中的对象相同的对象)。这是一个简单的演示:

>>> d = {'1': [1, 2, 3] }
>>> d
{'1': [1, 2, 3]}
>>> x = d['1']
>>> x.append(4)
>>> d
{'1': [1, 2, 3, 4]}

但总的来说,这是一个糟糕的模式。如果你可以避免它,不要这样做,这使得很难推断字典里面的内容。如果你想在那里换一些东西,可以把钥匙转过来。那正是你想要的。

答案 1 :(得分:5)

不,这是不可能的。执行行

p = d['a']

情况看起来不像这样:

p  --->  d['a']  --->  1

相反,它看起来像这样:

 p  --->  1

          ^
          |
d['a'] ---|

名称p直接绑定到任何被解析的对象作为键'a'的值。变量p对dict d一无所知,你现在甚至可以删除dict d

答案 2 :(得分:1)

并非总是如此,但如果关联的字典值是可变的,例如list,如果您通过使用内置的{{3}使用CPython解释器,则可以有效地创建指向它的指针。函数与其反函数相结合,如下所示:

import _ctypes

def di(obj_id):
    """ Inverse of id() function. """
    return _ctypes.PyObj_FromPtr(obj_id)

d = {'a': [1], 'b': 2, 'c': 3}
print(d)  # -> {'a': [1], 'b': 2, 'c': 3}
p = id(d['a'])
di(p)[0] = 42
print(d)  # -> {'a': [42], 'b': 2, 'c': 3}