2014-04-27 22 views
5

Pytanie to mówi.Python: Jaki jest odpowiednik PHP "=="

Oto małe wyjaśnienie.

W języku PHP. "==" działa tak

2=="2" (Notice different type) 
// True 

Choć w Pythonie:

2=="2" 
// False 
2==2 
// True 

Ekwiwalent dla Pythona "==" w PHP jest "==="

2===2 
//True 
2==="2" 
//False 

Million dollar pytanie. Co to jest php "==" odpowiednik w pythonie?

+0

@frostnational Nie, nie jest. – thefourtheye

+0

Prawda. Ale w PHP. Mimo że typ zmiennej jest inny, zwraca TRUE. W języku Python zwraca FALSE – Realdeo

+0

Jest to odpowiednik bardzo długiej i skomplikowanej sekwencji warunkowych konwersji w zależności od typów argumentów i ich wartości w pozornie arbitralnych (a więc prawie niemożliwych do uproszczenia) sposobach. Chciałbym żartować. – delnan

Odpowiedz

5

Nie ma. Musisz przekonwertować typy przed sprawdzeniem równości. W przykładzie, można zrobić

2==int("2") 
5

Python nie zmuszania pomiędzy typami drogę PHP robi, głównie.

Musisz zrobić to wyraźnie:

2 == int('2') 

lub

str(2) == '2' 

Python wymusza typów numerycznych (można porównać pacy z liczby całkowitej), a Python 2 również zamieniane między typami ciągów Unicode i bajtów (ku rozczarowaniu wielu).

1

Nie ma odpowiednika.

Różnica polega na tym, że Python jest silnie wpisany tam, gdzie PHP nie jest, więc porównanie dwóch typów w Pythonie zawsze zwróci false. Chyba że wyraźnie rzucasz na typ drugiej części porównania oczywiście.

1

Można również mieć

str(2) == "2" 
0

więc o to odpowiednik == PHP

def php_cmp(a, b): 
    if a is None and isinstance(b, basestring): 
     a = "" 
    elif b is None and isinstance(a, basestring): 
     b = "" 
    if a in (None, False, True) or b in (None, False, True): 
     return bool(a) - bool(b) 
    if isinstance(a, (basestring, int, long, float)) and isinstance(b, (basestring, int, long, float)): 
     try: 
      return cmp(float(a), float(b)) 
     except ValueError: 
      return cmp(a,b) 
    if isinstance(a, (tuple,list)) and isinstance(b, (tuple,list)): 
     if len(a) != len(b): 
      return cmp(len(a),len(b)) 
     return cmp(a,b) 
    if isinstance(a, dict) and isinstance(b, dict): 
     if len(a) != len(b): 
      return cmp(len(a),len(b)) 
     for key in a: 
      if key not in b: 
       raise AssertionError('not compareable') 
      r = cmp(a[key], b[key]) 
      if r: return r 
     return 0 
    if isinstance(a, (basestring, int, long, float)): 
     return 1 
    if isinstance(b, (basestring, int, long, float)): 
     return -1 
    return cmp(a,b) 

def php_equal(a, b): 
    return php_cmp(a,b) == 0 

Test:

>>> php_equal(2, '2') 
True 

ze względu na inny model obiektowy i realizacja tablica ta nie jest w 100% poprawne, ale powinno dać ci pojęcie, jakie mogą wystąpić problemy z automatyczną konwersją typów dla compa rison.

+1

To przekazuje przypadek testowy w pytaniu, ale jest bardzo odległe od całego zachowania '==' w PHP. – delnan

+1

Nie sądzę, że to działałoby w taki sam sposób jak PHP '==' działa. Zobacz [tabela porównawcza w dokumentacji ręcznej PHP] (http://us3.php.net/manual/en/types.comparisons.php). Sprawdź w "* Luźne porównania z == *". –

0

Może to jest coś podobnego:

x = 5 
y = "5" 

str(x) == str(y) 
True 

str(2) == str("2") 
True 
0

najlepszą odpowiedź można dać Ci to uniknąć PHP-jak porównanie. W każdym razie prowadzi to do trudnych do znalezienia błędów i godzin spędzonych na debugowaniu.

Ale dobrze, jeśli chcesz napisać własny interpreter PHP w Pythonie.

Prawdopodobnie chcesz najpierw rzucić zmienne i porównać je później. Jeśli program nie powiedzie się podczas rzucania, wcześniej wystąpią błędy, zapobiegając dalszym obrażeniom.

Powiązane problemy