Lỗi typeerror str object does not support item assignment

As the name suggests, the error TypeError: builtin_function_or_method object is not subscriptable is a “typeerror” that occurs when you try to call a built-in function the wrong way.

When a "typeerror" occurs, the program is telling you that you’re mixing up types. That means, for example, you might be concatenating a string with an integer.

In this article, I will show you why the TypeError: builtin_function_or_method object is not subscriptable occurs and how you can fix it.

Every built-in function of Python such as print(), append(), sorted(), max(), and others must be called with parenthesis or round brackets (()).

If you try to use square brackets, Python won't treat it as a function call. Instead, Python will think you’re trying to access something from a list or string and then throw the error.

For example, the code below throws the error because I was trying to print the value of the variable with square braces in front of the print() function:

And if you surround what you want to print with square brackets even if the item is iterable, you still get the error:

gadgets = ["Mouse", "Monitor", "Laptop"]
print[gadgets[0]]
# Output: Traceback (most recent call last):
#   File "built_in_obj_not_subable.py", line 2, in <module>
#     print[gadgets[0]]
# TypeError: 'builtin_function_or_method' object is not subscriptable

This issue is not particular to the print() function. If you try to call any other built-in function with square brackets, you also get the error.

In the example below, I tried to call max() with square brackets and I got the error:

numbers = [5, 7, 24, 6, 90]
max_num = max(numbers)
print[max_num]
# Traceback (most recent call last):
#   File "built_in_obj_not_subable.py", line 11, in <module>
#     print[max_num]
# TypeError: 'builtin_function_or_method' object is not subscriptable

How to Fix the TypeError: builtin_function_or_method object is not subscriptable Error

To fix this error, all you need to do is make sure you use parenthesis to call the function.

You only have to use square brackets if you want to access an item from iterable data such as string, list, or tuple:

gadgets = ["Mouse", "Monitor", "Laptop"]
print(gadgets[0])
# Output: Mouse
numbers = [5, 7, 24, 6, 90]
max_num = max(numbers)
print(max_num)
# Output: 90

Wrapping Up

This article showed you why the TypeError: builtin_function_or_method object is not subscriptable occurs and how to fix it.

Remember that you only need to use square brackets (

numbers = [5, 7, 24, 6, 90]
max_num = max(numbers)
print[max_num]
# Traceback (most recent call last):
#   File "built_in_obj_not_subable.py", line 11, in <module>
#     print[max_num]
# TypeError: 'builtin_function_or_method' object is not subscriptable

  1. to access an item from iterable data and you shouldn't use it to call a function.

If you’re getting this error, you should look in your code for any point at which you are calling a built-in function with square brackets and replace it with parenthesis.

Thanks for reading.



Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. Get started

Với năng lực của một người mới học lập trình, sáng kiến tối ưu nhất họ đưa ra là mỗi giá trị ta có một biến riêng biệt. Và đây được coi là một giải pháp hay!

Tuy nhiên vẫn ở tầm vi mô. Tèo nó tham, muốn lưu cả mấy thứ linh tinh về cô gấu dễ thương của hắn. Lúc đó, việc bạn kêu Tèo tạo ra số lượng biến để lưu trữ cũng là một điều gian nan rồi.

Đó là vì sao ta cần một thứ cũng như biến, nhưng nội công lại thâm hậu hơn biến, có khả năng lưu trữ nhiều giá trị cùng một lúc. Vì thế, Python có rất nhiều các container cho phép ta lưu trữ nhiều các giá trị, đối tượng cùng một lúc, hỗ trợ cho chúng ta trong việc truy xuất, tính toán, thay đổi (một số container trong Python không hỗ trợ việc thay đổi),…

Trong các ngôn ngữ lập trình khác, những container chứa được nhiều giá trị cùng một lúc thường được gọi làARRAY (mảng).


Giới thiệu về List trong Python

LIST là một container được sử dụng rất nhiều trong các chương trình Python. Một List gồm các yếu tố sau:

  • Được giới hạn bởi cặp ngoặc [ ], tất cả những gì nằm trong đó là những phần tử của List.
  • Các phần tử của List được phân cách nhau ra bởi dấu phẩy (,).
  • List có khả năng chứa mọi giá trị, đối tượng trong Python. Và bao gồm chứa chính nó! (một trường hợp hay ho Kteam sẽ giới thiệu ở phần khác).

Ví dụ:

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

Cách khởi tạo List

Sử dụng cặp dấu ngoặc [] đặt giá trị bên trong

Cú pháp:

[<giá trị thứ nhất>, <giá trị thứ hai>, .., <giá trị thứ n – 1>, <giá trị thứ n>]

Ví dụ:

`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

Sử dụng List Comprehension

Cú pháp

[Comprehension]

Ví dụ:

`>>> a = [kteam for kteam in range(3)]
> a [0, 1, 2]
another_lst = [[n, n 1, n 2] for n in range(1, 4)]
another_lst [[1, 1, 2], [2, 2, 4], [3, 3, 6]]`

List comprehension là một cách khởi tạo một List rất thú vị trong Python. Do đó, rất khó để có thể nói hết các trường hợp. Vì vậy, hãy tạm gác lại kiến thức này, bạn không cần phải cố gắng hiểu nó khi chúng ta chưa gặp gỡ các vòng lặp.


Sử dụng constructor List

Cú pháp:

list (iterable)

Lưu ý: iterable là một đối tượng nói chung của các container. Khái niệm này sẽ được Kteam giới thiệu ở bài sau. Đối với bạn khi theo dõi khóa học này của Kteam, bạn đã được biết hai iterable đó chính là chuỗi, và List.

Ví dụ:

`>>> lst = list([1, 2, 3])
> lst [1, 2, 3]
str_lst = list('HOWKTEAM')
str_lst ['H', 'O', 'W', 'K', 'T', 'E', 'A', 'M'] list(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable`

Một số toán tử với List trong Python

Các toán tử của List gần giống và tương tự với chuỗi (bạn có thể tham khảo toán tử của chuỗi ở bài KIỂU DỮ LIỆU CHUỖI – phần 2).

Toán tử +

`>>> lst = [1, 2]
> lst += ['one', 'two']
lst [1, 2, 'one', 'two']
lst += 'abc' # cộng List và chuỗi lst [1, 2, 'one', 'two', 'a', 'b', 'c'] 'abc' + [1, 2] # List cộng chuỗi cho phép, chuỗi cộng List thì không. Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not list`

Toán tử *

`>>> lst = list('KTER') * 2
> lst ['K', 'T', 'E', 'R', 'K', 'T', 'E', 'R']
[1, 2] * 3 [1, 2, 1, 2, 1, 2]`

Toán tử in

`>>> 'a' in [1, 2, 3] False
> 'a' in ['a', 2, 3] True
'a' in [['a'], 'b', 'c'] # chỉ có ['a'] thôi, không có 'a' False`

Các toán tử so sánh

Cú pháp:

A <toán tử so sánh\>B (A và B là 2 list)

Trong Python, cách so sánh 2 list cũng giống như cách so sánh 2 chuỗi.

Hiểu một cách đơn giản, kết quả của các toán tử so sánh (trên 2 list) sẽ dựa trên việc so sánh 2 list đó. Kết quả trả về sẽ là True hoặc False.

Khi so sánh 2 list, chương trình sẽ lần lượt so sánh các phần tử có cùng vị trí trong 2 list. Nếu xuất hiện 2 giá trị khác nhau, thì kết quả của phép so sánh sẽ là kết quả khi so sánh 2 giá trị đó.

Khi so sánh đến hết một trong 2 list nhưng vẫn không có giá trị khác biệt, chương trình sẽ so sánh độ dài của 2 list và trả về kết quả tương ứng.

Do đó:

  • [1, 2, 3] bằng [1, 2, 3]
  • [1, 2, 3] lớn hơn [1, 2] (do [1, 2, 3] dài hơn)
  • [4] > [3, 4] (do khi so sánh giá trị đầu tiên, ta có 4 > 3)

Ví dụ:

`>>> [1, 2, 3] == [1, 2, 3] True
> [1, 2, 3] == [1, 2] False
[4] > [3, 4] True
['b', 'c', 'd'] < ['x', 'y', 'z'] True ['a'] > ['b'] False `

Indexing và cắt List trong Python

Như đã đề cập, List với chuỗi giống nhau rất nhiều điểm, và phần Indexing và cắt List này hoàn toàn giống với Indexing và cắt chuỗi. (Nếu chưa biết về chuỗi bạn có thể tham khảo qua các bài về KIỂU DỮ LIỆU CHUỖI TRONG PYTHON – Phần 1)

`>>> lst = [1, 2, 'a', 'b', [3, 4]]
> lst[0] 1
lst[-1] [3, 4]
lst[3] 'b' lst[1:3] [2, 'a'] lst[:2] [1, 2] lst[2:] ['a', 'b', [3, 4]] lst[::-1] [[3, 4], 'b', 'a', 2, 1]`

Thay đổi nội dung List trong Python

Như bạn đã biết, ta không thể thay đổi nội dung của chuỗi như ví dụ bên dưới

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

0

Còn về phần List, ta có thể thay đổi nội dung của nó

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

1


Ma trận

Nghe ma trận hoành tráng thế thôi, bạn đã thấy nó rồi. Ví dụ một List chứa một List khác đấy.

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

2

Ta dễ dàng truy cập hai phần tử của List vừa mới khởi tạo

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

3

Hai giá trị đó cũng là một List. Và lẽ dĩ nhiên, bạn có quyền truy cập đến các phần tử con của phần tử nằm trong List bạn vừa khởi tạo. Thậm chí là cắt List!

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

4


Vấn đề cần lưu tâm khi sử dụng List

Những lưu ý này nếu bạn không biết, chương trình của bạn có thể có output khác với bạn mong muốn.

Không được phép gán List này qua List kia nếu không có chủ đích

Hãy xem xét đoạn code sau đây

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

5

Mọi thứ ổn, không có gì xảy ra, cho tới khi bạn thay đổi giá trị bất kì của một trong hai List đó.

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

6

Chỉnh một, nhưng đổi tới hai. Lí do là vì khi bạn gán giá trị List trực tiếp như thế, bạn đang đưa hai List đó trỏ cùng vào một nơi. Nói cách khác, cùng một giá trị list, nhưng lại có đến hai cái tên (có thể có nhiều hơn 2 tùy vào cách ta gán biến).

Hãy tưởng tượng Tèo có 50 nghìn. Sau đó bạn sử dụng phép thuật của mình gán số tiền cô gấu của Tèo bằng số tiền của Tèo. Khi đó, cô gấu dễ thương của Tèo không tự nhiên mà có 50 nghìn, mà thay vào đó, bạn đã gián tiếp cho phép gấu của Tèo sử dụng số tiền của Tèo nhịn ăn mì tôm bấy lâu nay. Và vào một ngày trơi mưa không rơi, cô ấy chạy đi mua một gói Snack mất 5 nghìn và sử dụng số tiền 50 nghìn bạn vừa mới gán cho cô ấy. Hậu quả là Tèo về thấy mất đâu 5 nghìn.

Do đó, trước khi gán, bạn phải copy giá trị của List

Ta có thể chứng thực điều đó bằng cách sử dụng toán tửis.


Toán tử is

Cú pháp:

A is B

Tác dụng: Kiểm tra xem hai biến A và B có cùng trỏ đến một đối tượng hay không. Nếu một trong hai biến được gán giá trị bằng biến còn lại, thì kết quả trả về làTrue.

Để hiểu rõ hơn về toán tử is, cũng như là lỗi dễ mắc phải khi gán giá trị của các list cho nhau, ta cùng xem xét các ví dụ sau:

Ví dụ 1:

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

7

Ví dụ 2:

`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

8

Kteam xin lưu ý với các bạn là:

Nếu như 2 biến cùng trỏvào một giá trị, thì việc thay đổi giá trị bên trong của một biến sẽ tác động đến biến còn lại. Tuy nhiên, việc thay đổi toàn bộ giá trị của một biến lại không gây ảnh hưởng tới biến kia, và khi đó, 2 biến lại không cùng trỏ vào một giá trị nữa.
`>>> [1, 2, 3, 4, 5] # Một List chứa 5 số nguyên [1, 2, 3, 4, 5]
> ['a', 'b', 'c', 'd'] # Một List chứa 4 chuỗi ['a', 'b', 'c', 'd']
[[1, 2], [3, 4]] # Một List chứa 2 List là [1, 2] và [3, 4] [[1, 2], [3, 4]]
[1, 'one', [2, 'two']] # List chứa số nguyên, chuỗi, và List [1, 'one', [2, 'two']]`

9

Lưu ý khi sử dụng toán tử is:

Đừng bao giờ sử dụng toán tử is đối với 2 biến thuộckiểu số hoặc 2 biếnthuộc kiểu chuỗi. Việc so sánh như vậykhông mang lại bất kì ý nghĩa nào cả. Nếu muốn so sánh, hãy sử dụng các toán tử khác. Các phép so sánh giữa một biến với giá trị None luôn được thực hiện bằng toán tử is.

Để tránh gặp phải lỗi khi gán giá trị của một list cho một list khác, trước khi gán, bạn phảicopy giá trị của list ban đầu

`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

0

Thêm một trường hợp nữa bạn cần phải lưu ý, đó là lúc bạn cần copy giá trị của một ma trận

`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

1

Đúng như chúng ta mong đợi. Thế nhưng…

`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

2

Lưu ý: nó chỉ sao chép các phần tử của List. Không hề sao chép các phần tử con của các phần tử nằm trong List. Do đó, nếu bạn thay đổi các phần tử trong List thì không sao, tuy nhiên nếu thay đổi phần tử con của các phần tử trong List, thì vấn đề lại xuất hiện.
`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

3

Đương nhiên, bạn vẫn giải quyết được, nhưng vì rườm rà khi không có vòng lặp. Do đó, chúng ta tạm dừng ở việc nhận biết. Còn phần giải quyết sẽ đợi nay mai. Khi võ công Xà Ngữ của chúng ta được nâng cao và tiếp cận với tuyệt kĩ vòng lặp.


Củng cố bài học

Đáp án bài trước

Bạn có thể tìm thấy câu hỏi của phần này tại CÂU HỎI CỦNG CỐ trong bài KIỂU DỮ LIỆU CHUỖI TRONG PYTHON – Phần 5

  • Cách đơn giản
`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

4

  • Cách ngắn
`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

5


Câu hỏi củng cố

  1. Tìm các cách khởi tạo List hợp lệ dưới đấy
    1. list(list(list('abc'))
    2. [1, 2, 3] + list(4)
    3. list()
    4. [0] * 3
  2. List có phải là một hashable object (immutable object)?
  3. Với chuỗi s dưới đây
`>>> lst = [1,2,5,"kteam"]
> lst [1, 2, 5, 'kteam']
empty_list = [] # khởi tạo list rỗng
empty_list []`

6

Hãy lấy mật mã trong chuỗi s, biết mật mã nằm giữa && và %%. Cố gắng tối thiểu dòng code

Đáp án của phần này sẽ được trình bày ở bài tiếp theo. Tuy nhiên, Kteam khuyến khích bạn tự trả lời các câu hỏi để củng cố kiến thức cũng như thực hành một cách tốt nhất!


Kết luận

Bài viết này đã sơ lược cho các bạn KIỂU DỮ LIỆU LIST TRONG PYTHON.

Ở bài sau, Kteam sẽ tiếp tục nói về KIỂU DỮ LIỆU LIST TRONG PYTHON – Phần 2. Cụ thể là một số phương thức của List trong Python

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Kiểu dữ liệu List trong Python - Phần 1 dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Lỗi typeerror str object does not support item assignment


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.