2011-08-11 13 views
6

が、私はエラーを生成しますPythonプログラムを持っているunsubscriptableです:TypeError例外は: 'NoneType' オブジェクトは、

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] 

エラーが2行目にあるので、私は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