我有一个Python dict对象d
。 d = {'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
对象是可变的。
答案 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}