2010-01-13 52 views
31

Là một phần của việc trả lời một câu hỏi khác, tôi đã viết đoạn mã sau mà hành vi có vẻ kỳ lạ ở cái nhìn đầu tiên:Tại sao việc gán cho True/False không hoạt động như tôi mong đợi?

print True     # outputs true 
True = False; print True # outputs false 
True = True;  print True # outputs false 
True = not True; print True # outputs true 

bất cứ ai có thể giải thích hành vi kỳ lạ này? Tôi nghĩ rằng nó có một cái gì đó để làm với mô hình đối tượng của Python nhưng tôi không chắc chắn.

Phiên bản 2.5.2 dưới Cygwin.

+18

Mà không phải là tốt đùa cũ '#define đúng false' hành động ở đây? – Amarghosh

+2

Trong phiên bản 3, Assigment True = False làm tăng lỗi sintax, vì vậy tôi cho rằng câu hỏi của bạn đề cập đến phiên bản 2 – jab

+2

điều gì lạ về nó? cẩn thận để xây dựng? – ghostdog74

Trả lời

73

Python có hai đối tượng dựng sẵn này (trong số những thứ khác). Chúng chỉ là đồ vật; ban đầu, họ chưa có tên, nhưng để biết chúng tôi nói gì, hãy gọi cho họ 0x600D0xBAD.

Trước khi bắt đầu thực hiện một (2.x) kịch bản Python, tên True bị ràng buộc với đối tượng 0x600D, và tên False bị ràng buộc với đối tượng 0xBAD, vì vậy khi chương trình đề cập đến True, nó nhìn vào 0x600D .

0x600D0xBAD biết rằng họ thường được sử dụng bởi các tên TrueFalse, đó là những gì họ ra khi họ nhận được in, ví dụ: các __str__ phương pháp 0x600D lợi nhuận 'True' và vân vân.

True = False 

giờ đây gắn với tên True cho một đối tượng khác. Từ bây giờ, cả hai tên TrueFalse đều đề cập đến cùng một đối tượng 0xBAD, trong đó, khi được in, xuất ra False.

True = True 

không thực sự làm bất cứ điều gì: Phải mất đối tượng được gọi bằng cái tên True, và liên kết mới (và cũ) tên True đến đối tượng này. Vì (vì bước trước) True đề cập đến 0xBAD trước đó, nó vẫn đề cập đến 0xBAD sau này. Do đó, in vẫn xuất ra False.

True = not True 

đầu tiên diễn các đối tượng mà tên True là ràng buộc để, đó là 0xBAD. Nó đưa đối tượng này cho toán tử not. not không quan tâm (hoặc biết) tên nào được sử dụng ở đây để tham chiếu đến 0xBAD, nó chỉ biết rằng khi được cung cấp 0xBAD, nó sẽ trả lại 0x600D.Giá trị trả lại này sau đó được trao cho toán tử gán =, gắn tên True vào đối tượng này.

Kể từ khi tên True bây giờ một lần nữa đề cập đến đối tượng 0x600D, gọi print True kết quả đầu ra True và thế giới lại tốt.

+16

@paxdiablo: Bạn đang nói về cái gì, "nhớ nhớ"? Đó là những địa chỉ bộ nhớ trong đó mọi thực thi Python tốt nên giữ các đối tượng này :-P – balpha

+0

@ user127555 Tôi biết; "chuyển nhượng không phải là một biểu thức" là một trong những tính năng Python yêu thích của tôi. Nhưng liên quan đến "không có nhà điều hành chuyển nhượng": Ngay cả [tài liệu chính thức] (https://docs.python.org/2/reference/simple_stmts.html) đề cập đến nó bằng tên đó. – balpha

17

Trong 2.x, True và False không phải là từ khóa, do đó, có thể tạo bóng được tạo sẵn theo cách này.

41

Hãy tưởng tượng này để thay thế:

A = True 
B = False 

print A   # true 
A = B; print A # false 
A = A; print A # false, because A is still false from before 
A = not A; print A # true, because A was false, so not A is true 

Điều chính xác cùng đang xảy ra, nhưng trong phiên bản của bạn cũng rất lúng túng, bởi vì bạn không mong đợi mà bạn có thể xác định lại True và False.

11

Bạn có thể kiểm tra xem True/False là một từ khóa:

>>> import keyword 
>>> keyword.iskeyword('True') 
False 

Vì nó không phải (trong phiên bản của tôi), gán Đúng = False chỉ có nghĩa là "Đúng" là một cái tên "biến".

+1

Chỉ cần lưu ý rằng bạn có lẽ nên sử dụng 'keyword.iskeyword ('True')' làm ví dụ thay vì vì hầu hết các từ khóa thực tế sẽ cung cấp một Cú pháp Cú pháp nếu được sử dụng ở đó. –

+0

@Ig, sure.thanks – ghostdog74

+2

Lưu ý: điều này được sửa trong python 3, True là một [từ khóa] (https://docs.python.org/3/reference/lexical_analysis.html#keywords). –

0

Bạn có thể dễ dàng khôi phục lại giá trị ban đầu sử dụng so sánh Boolean đơn giản:

True = 1==1 
False = 1==0 

Hoặc bằng cách chuyển đổi các chữ số nguyên để bools:

True = bool(1) # actually every number except 0 works 
False = bool(0) 
Các vấn đề liên quan