Sửa lỗi TypeError: ‘int’ object is not subscriptable như thế nào?

Traceback (most recent call last):
  File "d:\Py\Horse.py", line 40, in <module>
    main()
  File "d:\Py\Horse.py", line 37, in main
    walk(a,b)
  File "d:\Py\Horse.py", line 20, in walk
    ban_co[x][y] = dem
TypeError: 'int' object is not subscriptable
M = 8
dem = 0
X = [-2,-2,-1,-1,1,1,2,2]
Y = [-1,1,-2,2,-2,2,-1,1]
ban_co = [[M],[M]] 
gia_tri_khoi_dau = 0
ban_co = gia_tri_khoi_dau
n = int(input('Nhap n:'))

def hienThi():
    for i in range(n):
        for j in range(n):
           print(ban_co[i][j])
           print('\t')
        print('\n')
    
def walk(x,y):
    global dem 
    dem += 1
    ban_co[x][y] = dem
    for i in range(0,8):
        if(dem == n * n):
            print("Cac buoc di la: \n")
            hienThi()
            exit(0)
        u = x + X[i]
        v = y + Y[i]
        if(u >= 0 and u < n and v >= 0 and v < n):
            walk(u,v)
    dem -= 1
    ban_co[x][y] = 0


def main():
    a = int(input('Nhap vi tri ban dau.\nx:'))
    b = int(input('y:'))
    walk(a,b)
    print('Khong tim duoc duong di. ')

main()


3 dòng này là sao? Vậy ban_co có kiểu gì?

1 Like

E chuyển dòng code c++này

int board[M][M] = {  0  };

nó kiểu int nhưng e ko biết gán kiểu j

Bên trên là mảng 2 chiều có chiều 1 là M phần tử, chiều 2 là M phần tử, tổng có M*M phần tử.

Còn của bạn là:

Mảng 2 chiều có 2 phần tử ở chiều 1 và chiều thứ 2 là mảng có một phần tử, mỗi mảng có 1 giá trị là M, tổng là 2 phần tử.

Bạn nên biết, Python hỗ trợ mảng động.

2 Likes

làm cách nào để sửa mảng trên theo đúng cú pháp của python vậy ak

Lỗi là ở dòng gán ban_co = 0, sau đấy lại dùng ban_co[x][y] là sai cú pháp.

ban_co = gia_tri_khoi_dau

Hãy thay dòng đó bằng

ban_co = [[gia_tri_khoi_dau for i in range(M)] for j in range(M)]
4 Likes

Sau khi thay dòng

ban_co = gia_tri_khoi_dau

Thi ko còn lại lỗi

TypeError: 'int' object is not subscriptable

Mà chuyển thành

IndexError: list index out of range

Có cách nào để fix ko ạ

Có khi là do M :smiley:

Do mảng động nên không cần M riêng đâu, để vậy dễ lỗi.

3 Likes

thay biến banco trong câu lệnh mình gửi thành ban_co thôi.

M = 8
dem = 0
X = [-2,-2,-1,-1,1,1,2,2]
Y = [-1,1,-2,2,-2,2,-1,1]
gia_tri_khoi_dau = 0
ban_co = [
        [gia_tri_khoi_dau for i in range(M)]
        for j in range(M)
        ]

n = int(input('Nhap n:'))

def hienThi():
    for i in range(n):
        for j in range(n):
           print(ban_co[i][j])
           print('\t')
        print('\n')
    
def walk(x,y):
    global dem 
    dem += 1
    ban_co[x][y] = dem
    for i in range(0,8):
        if(dem == n * n):
            print("Cac buoc di la: \n")
            hienThi()
            exit(0)
        u = x + X[i]
        v = y + Y[i]
        if(u >= 0 and u < n and v >= 0 and v < n):
            walk(u,v)
    dem -= 1
    ban_co[x][y] = 0


def main():
    a = int(input('Nhap vi tri ban dau.\nx:'))
    b = int(input('y:'))
    walk(a,b)
    print('Khong tim duoc duong di. ')

main()
1 Like

Mảng X, Y này có thể test nhanh với n >= 5 và x, y = 0, 0 (tìm được). n = 5, x, y = 2, 1 thì không được.

3 Likes

Em cảm ơn bác nhé fix được lỗi r

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?