2011-03-20 118 views
2

我越來越從Python解釋一個奇怪的錯誤,當我運行此代碼:類型錯誤:「builtin_function_or_method」對象是unsubscriptable

TypeError: 'builtin_function_or_method' object is unsubscriptable 

的:

def make_map(): 
    map = [[Tile(0, 0) for col in range(MAP_WIDTH)] for row in range(MAP_HEIGHT)] 

    for x in range(MAP_WIDTH): 
     for y in range(MAP_HEIGHT):  
      map[x][y].tileType = round((libtcod.noise_perlin(noise2d,[y/MAP_WIDTH,x/MAP_HEIGHT])*100), 0) 

它在終端返回該回溯也指向這個功能:

def render_all(): 
    global color_light_wall 
    global color_light_ground 

    #go through all tiles, and set their background color 
    for y in range(MAP_HEIGHT): 
     for x in range(MAP_WIDTH): 
      tileType = map[x][y].tileType 
      if tileType>30: 
       libtcod.console_set_back(con, x, y, color_dark_wall, libtcod.BKGND_SET) 
      else: 
       libtcod.console_set_back(con, x, y, color_dark_ground, libtcod.BKGND_SET) 

    #draw all objects in the list 
    for object in objects: 
     object.draw() 

    #blit the contents of "con" to the root console 
    libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0) 

我認爲他們都與這條線有關:tileType = map[x][y].tileType但是如果有人能夠闡明這一點,我會很感激。

感謝,埃利奧特博納維爾

編輯:我忘了,包括我的瓷磚類代碼和完全回溯:

class Tile: 
    #a tile of the map and its properties 
    def __init__(self, tileType, blocked): 
     self.tileType = tileType 
     self.blocked = blocked 

回溯:

File "kindred.py", line 123, in <module> 
    render_all() 
    File "kindred.py", line 64, in render_all 
    tileType = map[x][y].tileType 
TypeError: 'builtin_function_or_method' object is unsubscriptable 
+0

請提供*全*回溯,而不是回跡片段 - 它們是完全沒有幫助 – 2011-03-20 14:59:44

+0

好了,對不起。編輯。 – 2011-03-20 15:00:13

+0

好吧,顯然'map'包含「內置函數或方法」而不是'Tile'對象。我們無法通過您展示的代碼告訴您爲什麼或者發生了什麼。嘗試'print repr(map)',併發布輸出(或者輸出的一個片段,如果它很大的話)。 – delnan 2011-03-20 15:01:33

回答

5

這個錯誤意味着python試圖在tileType = map[x][y].tileType中獲得一個變量名「map」,但是他沒有找到它,因此它在函數map中找不到它,因爲它是一個內置函數,可以解釋錯誤信息:

TypeError: 'builtin_function_or_method' object is unsubscriptable 

什麼,我會告訴你的是首先從「地圖」改變你的變量名到任何不影子任何內置的功能,第二時,你會改變你的變量名,你應該有一個NameError錯誤,因爲你的變量沒有定義,所以你應該修復這個問題。

希望我得到它的權利,並希望這種幫助:)

+0

這是錯誤。感謝您的幫助,奇點! – 2011-03-20 15:17:01

+0

@Elliot:很高興我能夠幫助:) – mouad 2011-03-20 21:24:26

1

你make_map功能不會失敗我提供的定義爲MAP_WIDTH,MAP_HEIGHT,noise2dlibtcod.noise_perlin。 (但是 - 雖然我確信這與您遇到的錯誤無關 - 您需要訪問陣列map[y][x],而不是map[x][y],因爲它是行列表,而不是列。當然,Python有一個map內置函數,你提供的代碼真的是字面上代碼中的代碼,或者(例如)map設置在一個地方,然後在另一個地方使用?因爲如果由於某種原因,你的map超出了範圍你開始試圖引用map[x][y].tileType,那麼你會得到內置函數map,而這會產生你列出的排序錯誤。

順便提一句,因爲 Python有內置的功能,首先調用其中一個變量map的方式可能是不好的風格。

+0

啊。我不知道Python已經內置了一個map函數。讓我檢查一下,看看你提出的是什麼問題。 – 2011-03-20 15:11:35

+0

足夠有趣,指出我需要訪問地圖[y] [x]解決了第一個問題,當第一個問題被修復時,彈出第二個問題。 :) Upvoting。 – 2011-03-20 15:18:00

0

你有一個名稱衝突和內置的地圖()方法被用在這裏。

0

正如其他人所猜測的,maprender_all指的是全局內置函數mapmake_map中的map = ...部分僅創建局部變量,該函數在函數返回時死亡,並且對於任何其他函數都不可見。只需return mapmake_map結束,並將其存儲在某個地方render_all可以訪問它,或者(更好)將其作爲參數傳遞給render_all

注意,一般不宜陰影內置的名稱,即不姓什麼mapfilterany或...

而且,在一個列表或任何其它序列迭代(和你的時候不要「T需要真正的重新分配存儲在它的對象),使用:

for row in rows: 
    for obj in rows: 
     ... # use obj 
相關問題