2011-08-11 160 views
6

我有一个产生错误的Python程序:类型错误: 'NoneType' 对象是unsubscriptable

def update_ranges(phonemelist) : 
    """ updating the rows and columns of the list of input phonemes""" 
    # make a copy of the list as we're going to modify it (optional) 
    phonlist = phonemelist[:] 
    # we don't need the row titles, they just complicate things 
    rowtitles, phonlist = zip(*phonlist) 
    rows = len(phonlist) 
    columns = range(len(phonlist[0])) 

    # for each row except the last 
    for i in xrange(rows - 1): 
     # update it by going down all the rows below it 
     for k in xrange(i+1, rows): 
      # for both columns 
      for j in columns: 
       update(phonlist, i, j, k, j) 

    # put the row titles back in (optional) 
    phonlist = zip(rowtitles, phonlist) 
    return phonlist 

def update(phonlist, curr_row, curr_col, next_row, next_col) : 
    """ applying co-articulation rules for comparing the ranges """ 
    curr_low, curr_high = phonlist[curr_row][curr_col] 
    next_low, next_high = phonlist[next_row][next_col] 

    # Rule 1: when one of the ranges is (-1,-1) 
    # replace the current range if it's (-1, -1) as its empty 
    if (curr_low, curr_high) == (-1, -1) : 
     phonlist[curr_row][curr_col] = next_low, next_high 
     return 
    # do nothing if the next range is (-1,-1) 
    if (next_low, next_high) == (-1, -1) : 
     return 

    # Rule 2: when ranges don't overlap 
    # replace the lowest value of current range when the next range is lower than the current range 
    elif curr_low > next_high : 
     phonlist[curr_row][curr_col] = curr_low, curr_low 
     return 
    # replace the highest values of current range when the next range is higher than the current range 
    elif next_low > curr_high : 
     phonlist[curr_row][curr_col] = curr_high, curr_high 
     return 

    # Rule 3: when ranges completely overlap 
    elif curr_low <= next_low and next_high <= curr_high or curr_low >= next_low and next_high >= curr_high : 
     # replace the values of the next range when the next range completely lies in the current range 
     if curr_high - curr_low > next_high - next_low : 
      phonlist[curr_row][curr_col] = next_low, next_high 
      return 
     # replace the values of the current range when the current range completely lies in the next range 
     else : 
      phonlist[curr_row][curr_col] = curr_low, curr_high 
      return 

    # Rule 4: when the ranges partially overlap 
    else : 
     # replace the values that is common to both ranges when next range is further ahead of the current 
     if curr_low < next_low and curr_high < next_high : 
      phonlist[curr_row][curr_col] = next_low, curr_high 
      return 
     # replace the values that is common to both ranges when current range is further ahead of the next 
     else : 
      phonlist[curr_row][curr_col] = curr_low, next_high 
      return 

错误:

File "coarticulation.py", line 217, in update 
    next_low, next_high = phonlist[next_row][next_col] 
TypeError: 'NoneType' object is unsubscriptable 

什么是错误的意思是,如何解决?

+0

我的意思是我写的只是这么多在一个单独的文件中第一次并与用户提供的输入工作。它是我研究项目的代码。当我将这部分加入到大代码中时,我正在研究从大文件列表中获取输入的位置,然后显示此错误。 – zingy

回答

8

这部分代码没有问题。这意味着要么

phonlist 

phonlist[next_row] 

不是list(或subscritable型),None。寻找你创建列表的位置。

编辑:

curr_low, curr_high = phonlist[curr_row][curr_col] 
next_low, next_high = phonlist[next_row][next_col] 

因为错误是在第二行,我觉得phonlist[next_row]None

+0

谢谢。我编辑了这个问题,并添加了调用该函数的部分。是否因为phonlist [next_row] [next_col]中没有传入值?与所有的比较一样,使用phonlist [curr_row] [curr_col]。 – zingy

+0

对不起,有很多变量,函数,嵌套循环,很难弄清楚发生了什么。 – utdemir

+0

我想我明白了。 – zingy

11

这是错误的Python,当您尝试从None值(Python的null当量)访问下标(索引)值返回:

>>> a = None 
>>> a[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not subscriptable 
相关问题