2010-03-15 70 views
5

Xin lỗi nếu điều này là khá noobish cho bạn, nhưng tôi chỉ bắt đầu học Python sau khi học C++ & Java, và tôi tự hỏi làm thế nào trên thế giới tôi chỉ có thể khai báo các biến như id = 0name = 'John' mà không cần bất kỳ int hoặc string 's ở phía trước! Tôi đã tìm ra rằng có lẽ đó là bởi vì không có số ' trong một số, nhưng làm thế nào Python sẽ tìm ra điều gì đó giống như def increase(first, second) thay vì một cái gì đó như int increase(int first, int second) trong C++ ?!Python phân biệt giữa các kiểu dữ liệu khác nhau như thế nào?

+2

Chỉ cần một gợi ý: không đặt tên cho các biến của bạn như "id", nó sẽ ghi đè lên hàm id được tích hợp(). Trong Python, các hàm là các đối tượng hạng nhất, vì vậy chúng chia sẻ không gian tên với các biến. –

+0

Cảm ơn! Tôi sẽ giữ cho rằng trong tâm trí – wrongusername

+0

một điều tôi đã học được từ python :: boost là tất cả mọi thứ, tôi có nghĩa là __everything__ trong python là từ loại Object (python Object). Thats như thế nào có thể là một int có thể là chuỗi hoặc char hoặc float hoặc bất cứ điều gì, tất cả các đối tượng của nó và được xử lý theo cách đó. str, int, vv chỉ là các dẫn xuất của đối tượng và do đó có thể được biến đổi. –

Trả lời

13

Các đối tượng theo nghĩa đen mà bạn đề cập đến (theo con trỏ đến ;-) các loại của riêng chúng, vì vậy khi tên bị ràng buộc với đối tượng đó, vấn đề loại không xuất hiện - đối tượng luôn có loại, tên không - chỉ đại biểu cho đối tượng mà nó bị ràng buộc.

Không có "tìm ra" trong def increase(first, second): - tên increase bị ràng buộc vào một đối tượng chức năng, tên firstsecond được hạch toán vào các thông số-tên và sẽ được ràng buộc (hoàn toàn có thể để đối tượng có kiểu khác nhau tại các điểm khác nhau) như increase được gọi.

Vì vậy, nói rằng cơ thể là return first + second - một cuộc gọi đến increase('foo', 'bar') sau đó sẽ vui vẻ trở lại 'foobar' (ủy thác việc bổ sung để các đối tượng, mà trong trường hợp này là chuỗi), và có thể sau một cuộc gọi đến increase(23, 45) sẽ giống như hạnh phúc trở lại 68 - một lần nữa bằng cách ủy nhiệm việc bổ sung cho các đối tượng bị ràng buộc với những tên đó tại điểm gọi, mà trong trường hợp này là ints. Và nếu bạn gọi với các loại không tương thích, bạn sẽ nhận được một ngoại lệ vì hoạt động bổ sung được ủy nhiệm không thể hiểu được tình huống - không có vấn đề gì lớn!

+0

Nhờ cả bạn và mọi người đã đóng góp! :) – wrongusername

+0

+1 Đây là một câu trả lời tuyệt vời. –

4

Khi nói đến việc gán giá trị văn chương cho các biến, kiểu của giá trị văn chương có thể được suy ra tại thời điểm phân tích từ vựng. Ví dụ, bất cứ điều gì phù hợp với biểu thức chính quy (-)?[1-9][0-9]* có thể được suy ra là một số nguyên theo nghĩa đen. Nếu bạn muốn chuyển đổi nó thành một phao, cần phải có một diễn viên rõ ràng. Tương tự, một chuỗi ký tự là bất kỳ chuỗi ký tự nào được bao gồm trong dấu nháy đơn hoặc kép.

Trong cuộc gọi phương thức, các tham số không được kiểm tra loại. Bạn chỉ cần truyền số lượng chính xác của chúng để có thể gọi phương thức. Vì vậy, miễn là cơ thể của phương pháp không gây ra bất kỳ lỗi nào đối với các đối số, bạn có thể gọi cùng một phương thức với nhiều loại đối số khác nhau.

+0

+1 Đối với "phân tích từ vựng" - súc tích và chính xác! –

+0

(Tất nhiên, các quy tắc phân tích từ vựng thực tế để phân tích cú pháp phức tạp hơn thế này.) –

+0

Ngoài ra, để là pedantic, '(-)? [1-9] [0-9] *' sẽ là gì * số thập phân * số nguyên theo nghĩa đen. –

0

Trong Python, Không giống như trong C++ và Java, các số và chuỗi là cả hai đối tượng. Vì vậy, đây:

id = 0 
    name = 'John' 

tương đương với:

id = int(0) 
    name = str('John') 

Kể từ biến idname là tài liệu tham khảo có thể giải quyết bất kỳ đối tượng Python, họ không cần phải được khai báo với một loại cụ thể.

+0

Tại sao lại là downvote? – wrongusername

+1

Có một vài điều gây hiểu nhầm về bài đăng này. 1) Đúng là int và str là các đối tượng trong Python và C++ và Java có một số kiểu nguyên thủy cũng như các đối tượng, nhưng đây không phải là lý do tại sao bạn không phải khai báo các biến trong Python. 2) Mã tương đương sẽ là 'id = int (0)' và 'name = str ('John')'; 'Số' và' Chuỗi' không phải là tên của bất kỳ điều gì trong Python, và nó không thực sự rõ ràng bất cứ điều gì để rephrase những điều như vậy, xem xét điều này vẫn đòi hỏi phải tạo 'int' và' str' đối tượng từ literals. 3) "đối tượng con trỏ" không phải là thuật ngữ kỹ thuật trong ngữ cảnh của Python AFAIK –

+0

Cảm ơn Mike! :) – wrongusername

7

Python là được nhập động: tất cả các biến có thể tham chiếu đến đối tượng thuộc bất kỳ loại nào.idname có thể là bất kỳ thứ gì, nhưng các đối tượng thực tế có các loại như intstr. 0 là một chữ được phân tích cú pháp để tạo đối tượng int'John' một chữ tạo thành đối tượng str. Nhiều loại đối tượng không có chữ và được trả về bởi một số có thể gọi (như frozenset —không có cách nào để tạo hàng rào chữ, bạn phải gọi frozenset.)

Do đó, không có điều gì như khai báo biến, vì bạn không xác định bất cứ điều gì về biến. id = 0name = 'John' chỉ là nhiệm vụ.

increase trả về một int vì đó là những gì bạn trả lại trong đó; không có gì trong Python buộc nó không phải là bất kỳ đối tượng nào khác. firstsecond chỉ là ints nếu bạn làm như vậy.

Đối tượng, ở một mức độ nhất định, có chung một giao diện. Bạn có thể sử dụng cùng một toán tử và các hàm trên tất cả chúng, và nếu chúng hỗ trợ hoạt động cụ thể đó, nó hoạt động. Đó là một kỹ thuật phổ biến, được khuyến nghị sử dụng các loại khác nhau hoạt động tương tự nhau; điều này được gọi là nhập vịt. Ví dụ: nếu một cái gì đó có một đối tượng file, bạn có thể chuyển đối tượng cStringIO.StringIO, hỗ trợ phương thức giống như tệp (như readwrite) nhưng là một loại hoàn toàn khác. Đây là loại giống như giao diện Java, nhưng không yêu cầu bất kỳ cách sử dụng chính thức nào, bạn chỉ cần xác định các phương thức thích hợp.

+0

Cảm ơn! Tôi sẽ hoàn toàn upvote bạn, nhưng tiếc là giới hạn bỏ phiếu hàng ngày của tôi đã đạt được. – wrongusername

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