2015-06-27 22 views
15

Tôi là người mới sử dụng Python và làm theo hướng dẫn. Có một ví dụ về list trong hướng dẫn:LoạiError: đối tượng 'list' không thể gọi được trong python

example = list('easyhoss') 

Bây giờ, Trong hướng dẫn, example= ['e','a',...,'s']. Nhưng trong trường hợp của tôi Tôi nhận được lỗi sau:

>>> example = list('easyhoss') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object is not callable 

Hãy cho tôi biết nơi tôi sai. Tôi đã tìm kiếm SO this nhưng nó khác.

+21

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

+1

bạn đã gán bất kỳ giá trị nào cho 'example'? –

+0

@AvinashRaj nope, –

Trả lời

41

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.

  1. 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ể đó.

  2. 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.

+0

Vì vậy, nó làm gì? Danh sách được tích hợp. Nó sẽ hoạt động tốt. –

+0

@khanshah Python rất linh hoạt: bạn có thể gán lại nội trang cho một thứ khác, như ở đây. – Evert

+0

@khanshah Hãy thử và xem nó hoạt động như thế nào. – juanchopanza

1

Đối với tôi đó là một máy chủ bình trở về một số videos mảng (mà tôi dự kiến ​​sẽ được ở định dạng json ..)

thêm json.dumps(videos) cố định vấn đề này

+1

Có cùng ở đây. Kiểu trả về từ truy vấn trên bảng SQLAlchemy phải được gói với json.dumps để loại bỏ lỗi này. – somnathchakrabarti

+0

bạn có biết tại sao không? – LazerStackr

Các vấn đề liên quan