2010-08-09 3 views
1

J'utilise Python 3.1.2 (Mac OS X 10.6) et a trouvé ce comportement bizarre (je suis un débutant, BTW):Pourquoi la coercition de type fonctionne différemment sur les scripts/invite interactive?

Sur l'invite interactive:

>>> fraction = 4/3 
>>> print(fraction) 
1.33333333333 
>>> print(type(fraction)) 
<class 'float'> 

Cependant, si Je fais la même chose dans un script, les résultats sont différents:

## fraction.py 

fraction = 4/3 
print(fraction) 
print(type(fraction)) 

sortie:

1 
<class 'int'> 

Est-ce normal?

Répondre

2

Non ce n'est pas normal. Etes-vous sûr que vous exécutez Python 3 dans ce script? Il est possible que Python 2.5 (l'installation par défaut sur Mac OS X) soit choisi. Essayez de vérifier par

import sys 
print (sys.version) 

Si vous exécutez le script comme ./fraction.py, vous pouvez forcer le shell à utiliser Python 3.1 en mettant

#!/usr/bin/env python3.1 

dans la première ligne.

+0

Vous avez raison. J'utilise TextMate (un éditeur de texte) qui a un mécanisme automatisé pour tester les scripts Python et il appelle probablement une version plus ancienne (bien que dans la sortie il soit en 3.1.2). J'ai vérifié dans la ligne de commande et vous avez raison, il y a quelque chose qui ne va pas avec TextMate (pas avec Python). Merci! –

+1

Voir http://stackoverflow.com/questions/1775954/using-python-3-1-with-textmate/ pour savoir comment utiliser Python 3 avec TextMate. –

1

Ce que dit KennyTM. La raison en est que dans Python < 3, / signifie une division entière si les deux arguments sont des entiers. C'était stupide, et a été changé dans Py3k de sorte que / renvoie toujours un float, même si divisant int s.

+0

Je savais qu'il y avait une différence, mais j'ai oublié de vérifier si je courais la bonne version avant de poster la question. Merci quand même! –

+0

@Andreas Fernandes Si vous avez besoin du comportement 3.0 dans 2.x, mettez 'from __future__ import division' comme première ligne de votre script –

Questions connexes