2011-08-11 26 views
6

bir hata üreten bir piton programı var unsubscriptable geçerli:TypeError: 'NoneType' nesne

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 

Hata:

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

hata ne anlama geliyor ve nasıl düzeltebilirim?

+0

Yani ben ilk ayrı bir dosyada sadece bu kadar yazdım: – zingy

cevap

8

Kodun bu bölümünde bir sorun değildir. Ya

phonlist 

veya

phonlist[next_row] 

bir list (veya bir subscritable tip), bir None olmadığı anlamına gelir. Listeyi oluşturduğunuz yeri arayın.

Düzenleme: hata ikinci uyumludur

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

Çünkü, phonlist[next_row]None olduğunu düşünüyorum.

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

Teşekkürler. Soruyu düzenledim ve bu işlevin çağrıldığı bölümü ekledim. Phonlist [next_row] [next_col] 'da bir değer geçmedi mi? Tüm karşılaştırmalarda olduğu gibi [curr_row] [curr_col] kullanılır. – zingy

+0

Üzgünüz, çok fazla değişken var, fonksiyonlar, iç içe geçmiş döngüler var, neler olduğunu anlamaya çalışmak zor. – utdemir

+0

Sanırım anladım. – zingy

11

Bu

sen (Python'un null eşdeğeri) None değerinden bir subscripted (endeksli) değerini erişmeye çalıştığınızda Python döndüren hatadır ve giriş verilen kullanıcı ile çalıştı. Ve benim araştırma projemin kodu. Bu parçaya büyük kodla girdiğimde, büyük bir liste olan dosyadan girdi aldığı yerde çalışıyorum, o zaman bu hatayı gösteriyor.
İlgili konular