2010-01-13 65 views
31

作爲回答另一個問題的一部分,我寫了下面的代碼,其行爲似乎離奇乍一看:爲什麼分配True/False不能像我所期望的那樣工作?

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

任何人都可以解釋這種奇怪的行爲?我認爲這與Python的對象模型有關,但我不確定。

它是Cygwin下的2.5.2版本。

+18

並不好老笑話'的#define真正FALSE'在這裏行動? – Amarghosh

+2

在版本3中,assigment True = False引發了一個sintax錯誤,所以我想你的問題涉及版本2 – jab

+2

奇怪的是什麼?謹慎闡述? – ghostdog74

回答

73

Python有這兩個(其中)內建對象。他們只是對象;在開始時,他們還沒有任何名字,但要知道我們所指的是什麼,我們稱之爲0x600D0xBAD

開始執行一個Python(2.X)腳本之前,該名True獲取綁定對象0x600D,並且名稱False獲取綁定對象0xBAD,所以當程序是指True,它着眼於0x600D

因爲0x600D0xBAD知道,他們通常使用的名稱TrueFalse,那就是當他們得到打印他們的輸出,即0x600D回報'True'等等__str__方法。

True = False 

現在將名稱True綁定到不同的對象。從現在開始,名稱TrueFalse指的是相同的對象0xBAD,其在打印時輸出False

True = True 

並沒有真正做任何事情:它需要通過名稱True所指的對象,並結合新(老)名稱True此對象。由於(因爲上一步)True在此之前指的是0xBAD,所以在此之後它仍然指的是0xBAD。因此,打印仍然輸出False

True = not True 

首先把該名稱True綁定到,這是0xBAD的對象。它將此對象提供給not運算符。 not不在乎(或知道)這裏用什麼名字來指代0xBAD,它只知道當給出0xBAD它應該返回0x600D。然後將此返回值提供給賦值運算符=,將名稱True綁定到此對象。

由於名稱True現在再次指對象0x600D,調用print True輸出True,世界又好了。通過轉換整數字面量布爾變量

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

或者:

+16

@paxdiablo:你在說什麼,「助記符」?這些都是內存地址,每個好的Python實現應該包含這些對象:-P – balpha

+0

@ user127555我知道; 「任務不是表達式」是我最喜歡的Python特性之一。但關於「沒有分配運營商」:即使是[官方文檔](https://docs.python.org/2/reference/simple_stmts.html)也是通過該名稱引用的。 – balpha

17

在2.x中,True和False不是關鍵字,所以可以用這種方式隱藏內置插件。

41

想象一下這個:

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 

完全一樣的東西是怎麼回事,但在你的版本,這是令人困惑,因爲你不希望你可以重新定義真與假。

11

你可以查看是否真/假是一個關鍵字:

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

因爲它不是(在我的版本),分配真=假只是意味着「真」是另一個「變量」的名字。

+1

只是一個說明,你應該可能使用'keyword.iskeyword('True')'作爲一個例子,因爲大多數實際的關鍵字會在那裏使用SyntaxError。 –

+0

@Ig,sure.thanks – ghostdog74

+2

注意:這是在python 3中修復的,True是[keyword](https://docs.python.org/3/reference/lexical_analysis.html#keywords)。 –

0

你可以很容易地使用簡單的布爾比較恢復原來的值

True = bool(1) # actually every number except 0 works 
False = bool(0) 
相關問題