Có vẻ như bạn đã che giấu tên được tích hợp list
bằng tên ví dụ ở đâu đó trong mã của bạn.
>>> example = list('easyhoss')
>>> list = list('abc')
>>> example = list('easyhoss')
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: 'list' object is not callable
Tôi tin điều này khá rõ ràng. Python lưu trữ các tên đối tượng (các hàm và các lớp là các đối tượng, quá) trong các từ điển (các không gian tên được thực hiện như các từ điển), do đó bạn có thể viết lại khá nhiều bất kỳ tên nào trong bất kỳ phạm vi nào. Nó sẽ không hiển thị như là một lỗi của một số loại. Bạn nên sử dụng một IDE (ví dụ: một phiên bản miễn phí của PyCharm hoặc Atom với các plugin Python) làm nổi bật tên bóng.
EDIT. Nhờ các câu hỏi bổ sung của bạn, tôi nghĩ rằng toàn bộ điều về built-ins
và phạm vi là đáng làm rõ. Như bạn có thể biết, Python nhấn mạnh rằng "các trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc". Và có một vài quy tắc đằng sau vấn đề bạn gặp phải.
Không gian tên. Python hỗ trợ các vùng tên lồng nhau. Về mặt lý thuyết bạn có thể làm tổ không gian tên vô tận. Như tôi đã đề cập, các không gian tên cơ bản là các từ điển tên và tham chiếu đến các đối tượng tương ứng. Bất kỳ mô-đun nào bạn tạo đều có không gian tên "chung" của riêng nó. Trong thực tế nó chỉ là một không gian tên địa phương đối với mô-đun cụ thể đó.
Phạm vi. Khi bạn gọi tên, Python sẽ nhìn vào không gian tên cục bộ (tương đối so với cuộc gọi) và nếu nó không tìm thấy tên nó lặp lại nỗ lực trong một không gian tên cấp cao hơn. built-in
các chức năng và lớp học nằm trong một không gian tên cao đặc biệt __builtins__
. Nếu bạn khai báo list
trong không gian tên chung của mô-đun, trình thông dịch sẽ không bao giờ tìm kiếm tên đó trong không gian tên cấp cao hơn là __builtins__
. Tương tự, giả sử bạn tạo một biến số var
bên trong một hàm trong mô-đun của bạn và một biến khác var
trong mô-đun. Sau đó, nếu bạn tham khảo var
bên trong hàm Python sẽ không bao giờ cung cấp cho bạn toàn cầu var
, bởi vì có một var
trong không gian tên cục bộ - nó không cần phải tìm kiếm trong không gian tên cấp cao hơn.
Đây là minh hoạ đơn giản.
>>> example = list("abc") # Works fine
# Creating name "list" in the global namespace of the module
>>> list = list("abc")
>>> example = list("abc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
# Python looks for "list" and finds it in the global namespace.
# But it's not the proper "list".
# Let's remove "list" from the global namespace
>>> del(list)
# Since there is no "list" in the global namespace of the module,
# Python goes to a higher-level namespace to find the name.
>>> example = list("abc") # It works.
Vì vậy, như bạn thấy không có gì đặc biệt về built-ins
. Và trường hợp của bạn là một ví dụ điển hình về các quy tắc phổ quát.
P.S.
Khi bạn bắt đầu phiên Python tương tác, bạn tạo mô-đun tạm thời.
Nguồn
2015-06-27 09:22:10
Một nơi nào đó bạn đã gán * một danh sách thực tế dụ * vào tên 'danh sách', làm bóng được tích hợp; ** đừng làm vậy **! – jonrsharpe
bạn đã gán bất kỳ giá trị nào cho 'example'? –
@AvinashRaj nope, –