Python 元组作为字典的键说:';元组';对象不支持项分配

Python 元组作为字典的键说:';元组';对象不支持项分配,python,dictionary,tuples,Python,Dictionary,Tuples,我在python中有这个函数: def initialize(s,cfg): pi={}, for i,w in enumerate(s): j=i+1 for X,rhs in cfg.items(): if rhs.has_key(w): print (j,j,X),rhs[w] pi[(j,j,X)]=rhs[w] return pi 当我跑的时

我在python中有这个函数:

def initialize(s,cfg):
    pi={},
    for i,w in enumerate(s):
        j=i+1
        for X,rhs in cfg.items():
            if rhs.has_key(w):
                print (j,j,X),rhs[w]
                pi[(j,j,X)]=rhs[w]
    return pi
当我跑的时候

    pi[(j,j,X)]=rhs[w]
TypeError: 'tuple' object does not support item assignment
上面的打印返回
(1,1,'DT')1.0

我肯定遗漏了什么,但就我所见,我并没有试图改变元组。为什么我会犯这样的错误

有一次,我认为这可能是因为j和X被指向并试图创建一个新的元组,但这并没有起作用。我也在贝壳上试过:

>>> pi={}
>>> X="DT"
>>> j=1
>>> t=(j,j,X)
>>> pi[t]=1.0
>>> pi
{(1, 1, 'DT'): 1.0}

正如你所看到的,这一切都是有效的。关于为什么我在函数中得到的
元组不支持项分配错误,但在shell中不支持项分配错误,您有什么想法吗?

您在这一行有一个尾随逗号:

pi={},
这是以下的简写:

pi = ({},)

换句话说,pi是一个元组。

的确如此。如果你认为一个变量是一个dict,Python告诉你它是一个元组,那么首先要做的就是假设Python是正确的,并找出为什么你的变量是元组而不是字典。另外值得注意的是,
dict.has_key
在Python 3.x中被删除了,在rhs中使用
if w是一年多以来的最佳实践。。。