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 = 0
và name = '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?
Trả lời
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 first
và second
đượ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!
Nhờ cả bạn và mọi người đã đóng góp! :) – wrongusername
+1 Đây là một câu trả lời tuyệt vời. –
Python sử dụng phương pháp gõ vịt - nếu nó đi, trông và quacks giống như một con vịt, thì đó là một con vịt. Nếu bạn vượt qua trong một chuỗi, và cố gắng làm một cái gì đó số trên nó, sau đó nó sẽ thất bại.
Có một cái nhìn tại địa chỉ: http://en.wikipedia.org/wiki/Python_%28programming_language%29#Typing và http://en.wikipedia.org/wiki/Duck_typing
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.
+1 Đối với "phân tích từ vựng" - súc tích và chính xác! –
(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.) –
Ngoài ra, để là pedantic, '(-)? [1-9] [0-9] *' sẽ là gì * số thập phân * số nguyên theo nghĩa đen. –
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 id
và name
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ể.
Tại sao lại là downvote? – wrongusername
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 –
Cảm ơn Mike! :) – wrongusername
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.id
và name
có thể là bất kỳ thứ gì, nhưng các đối tượng thực tế có các loại như int
và str
. 0
là một chữ được phân tích cú pháp để tạo đối tượng int
và '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 = 0
và name = '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. first
và second
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ư read
và write
) 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.
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
- 1. Tên xung đột giữa các nhãn trường của các kiểu dữ liệu khác nhau trong Haskell
- 2. sự khác biệt giữa kiểu dữ liệu thập phân và số trong postgresql
- 3. Cách phân biệt giữa các mạng wifi khác nhau?
- 4. Sự khác nhau giữa các kiểu dữ liệu BLOB và TEXT trong MySQL là gì?
- 5. sự khác nhau giữa các kiểu dữ liệu thô dài và dài trong Oracle là gì?
- 6. Làm thế nào để khai báo một loạt các kiểu dữ liệu khác nhau
- 7. Điều gì khác nhau giữa phân cụm cơ sở dữ liệu và phân vùng cơ sở dữ liệu
- 8. Sự khác nhau giữa các kiểu dữ liệu cột BOOL và BOOLEAN của MySQL là gì?
- 9. Sự khác nhau giữa một kiểu dữ liệu trừu tượng (ADT) và một cấu trúc dữ liệu là gì?
- 10. Danh sách khác nhau giữa cơ sở dữ liệu SQL
- 11. Có sự khác nhau nào giữa các kiểu dữ liệu số nguyên và bit (n) cho một bitmap không?
- 12. Sự khác nhau giữa BYTE và CHAR trong kiểu dữ liệu cột
- 13. Cách di chuyển dữ liệu giữa 2 bảng/với các cột khác nhau trong cơ sở dữ liệu khác nhau
- 14. Sự khác nhau giữa kiểu dữ liệu-dojo và dojotype là gì?
- 15. Ngôn ngữ lập trình khác nhau như thế nào giữa các phần khác nhau của thế giới?
- 16. Sự khác biệt giữa các Loại Message XMPP khác nhau?
- 17. Sự khác biệt giữa kiểu dữ liệu "Văn bản" và "Chuỗi" trong SQLite
- 18. Trình biên dịch C/C++ xử lý việc nhập kiểu giữa các kiểu với các phạm vi giá trị khác nhau như thế nào?
- 19. Tạo kiểu phân phối khác nhau với setup.py
- 20. Trả về kiểu dữ liệu khác nhau tùy thuộc vào dữ liệu (C++)
- 21. Công cụ khác biệt dữ liệu để tìm sự khác biệt giữa hai Tệp MDB Access
- 22. Sự khác biệt giữa bản rõ và dữ liệu nhị phân là gì?
- 23. nhật thực: cách phân biệt/phân biệt các không gian làm việc mở khác nhau
- 24. Sự khác biệt giữa dữ liệu có thể biến đổi và nhị phân là gì
- 25. Giải thích sự khác biệt giữa cấu trúc * dữ liệu * và loại dữ liệu *
- 26. Sự khác biệt giữa String.getBytes() và Bytes.toBytes (Dữ liệu chuỗi)
- 27. Sự khác biệt giữa tập dữ liệu và cơ sở dữ liệu là gì?
- 28. Tôi làm cách nào để phân biệt các loại ngoại lệ khác nhau?
- 29. Sự khác nhau giữa cơ sở dữ liệu và kho dữ liệu là gì?
- 30. Sự khác nhau giữa DECIMAL và NUMERIC
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. –
Cảm ơn! Tôi sẽ giữ cho rằng trong tâm trí – wrongusername
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. –