2016-04-28 1 views
0

J'écris une sémantique formelle pour Python. J'espère que certains gourou Python peuvent m'aider. Au fur et à mesure que l'exécution du programme parcourt une liste d'instructions, chaque instruction d'assignation (ou expression) rencontrée, elle déduit le type en fonction du contexte. Mais stocke-t-elle ce type quelque part (pour la prochaine fois vérifier le type), ou effectue-t-il l'opération, puis rejette le type, puis infère le type à nouveau la prochaine fois qu'il rencontre la variable? Ceci est pour Python 3+ btw (j'espère que je l'ai fait clair)Sémantique et état de Python

+3

Qu'entendez-vous par * il déduit le type en fonction du contexte *? – bereal

+0

bien s'il y a une variable a .. et l'instruction est a = 2 .. alors elle déduit une est de type entier .. ou si c'est "a = 2 + 2.2" alors par le contexte elle déduit une est de type float –

+0

bien ce n'est pas beaucoup d'inférer de penser à un entier comme un nombre entier. Ce n'est pas tellement inférer quoi que ce soit car c'est comme ça que les entiers sont définis en python, sa définition aussi forte que 'int a = 10;' si vous voulez qu'il soit autre chose qu'un entier, vous devez le déclarer comme dans n'importe quelle autre langue . Juste que floats, entiers, chaînes, octets, tuples, listes, dictionnaires et nombres imaginaires ont des raccourcis – joojaa

Répondre

1

Python utilise le typage dynamique. Le type fait partie de la valeur. Partout où une valeur va, son type va avec. (Vous pouvez obtenir une valeur indépendante correspondant à ce type avec la fonction type().) Le type d'une valeur est uniquement rejeté lorsque la valeur entière est rejetée. Une variable est juste une référence à une valeur: chaque variable fait référence à une seule valeur, et en général il peut s'agir de n'importe quelle valeur possible, sans restriction sur le type.

Par exemple, dans

a = 2 

Python ne fait pas a une variable int; 2 est ce que a le type int. a est juste une référence à 2, qui se trouve être un nombre entier. Lorsque vous écrivez ensuite

b = a + 3 

Python obtient le type de a en obtenant simplement la valeur visée par a, puis obtenir le type de cela. L'expression est évaluée et le résultat stocké dans b. Du point de vue d'un langage typé statiquement, c'est comme si toutes les variables en Python avaient le même type valeur, donc chacune contient une valeur.

Pour plus d'informations sur le typage statique et dynamique, voir this other question.

+0

Donc, en Java il y a un magasin, ou un état, qui connaît le type d'un objet. Donc vous ne pouvez pas dire "int i = 1 .... i = true" car le type de i est int ... En Python vous pouvez le faire car il va déclarer la variable. Donc, il n'y a pas d'état comme ça, à partir de votre réponse, je reçois l'idée "a = 2" .. 2 est stocké dans l'adresse mémoire a points. et puis quand j'effectue une opération sur un, il regarde l'adresse, voit est un de type entier, puis évalue l'opération? –

+0

À droite, les variables n'ont pas de type en Python comme c'est le cas en Java. Ils n'ont pas non plus besoin d'être déclarés avant d'être fixés. L'ensemble des variables se comporte très bien comme un 'Map ' en Java. (En fait, vous pouvez obtenir une valeur très similaire à cette carte en appelant 'vars()'.) –

+0

Cette confusion est la raison pour laquelle je préfère le terme "nom" sur "variable" en Python. Le mot «variable» donne l'impression que c'est quelque chose plutôt qu'une référence à quelque chose. –