@Shalom napisal na blogu o operatorze porownania w php == vs ===.
Czy w Pythonie tego typu porownania/konwersje typow też mają takie neispodzianki ?
@Shalom napisal na blogu o operatorze porownania w php == vs ===.
Czy w Pythonie tego typu porownania/konwersje typow też mają takie neispodzianki ?
>>> 1 == True
True
Python jest silnie typowany, zarówno PHP jak i JS są słabo typowane. W Pythonie raczej nie ma takich jazd. W Pythonie 2 można było zrobić np.:
True = False
True == False // True
Ale w Pythonie 3 zarówno True
i False
są już słowami kluczowymi, więc tak się nie da. Silne typowanie nie pozwala na takie patologie.
Python nie pozwala na takie automatyczne konwersje. Ba, jest w tym nawet bardziej szczegółowy niż taka java. Jak zrobisz "ala"+1
to python zaprotestuje:
TypeError: unsupported operand type(s) for +: 'str' and 'int'
Musisz rzutować explicite.
Ciekawe jest, że w wypadku użycia if, puste sekwencje zwracają false. Dlatego nie trzeba używać metod isEmpty albo porównywać długość sekwencji do 0, a wystarczy:
if not seq:
if seq:
ale o magicznych błędach języka podobnych do tego PHPowego, nie słyszałem.
@big_y Bo to działa w ten sposób, że:
if seq:
pass
Jest równoważne:
if bool(seq):
pass
A nie tak jak mogłeś myśleć, że:
if seq == True:
pass
Py 2.7 (IDLE):
>>> 1 == True
True
>>> 1 is True
False
>>> bool(1)
True
>>> bool('1')
True
>>> bool('0')
True
>>> bool(int('0'))
False
>>>
Jak widać 1 == True daje zupełnie inny wynik niż 1 is True.
Natomiast takie coś
if 1 == True:
pass
po sprawdzeniu parserem PEP8 daje komunikat:
E712 comparison to True should be 'if cond is True:' or 'if cond:'
Na https://www.python.org/dev/peps/pep-0008/ jest napisane aby do porównywania booli używać samego if
Don't compare boolean values to True or False using == .
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True: