-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_portees_variables.py
More file actions
195 lines (138 loc) · 5.54 KB
/
test_portees_variables.py
File metadata and controls
195 lines (138 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#!/usr/bin/python
# -*-coding:Utf-8 -*
#---------------------------------------------------------------------
# SOURCE : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/232520-portee-des-variables-et-references
#
# Portees des variables
# local
# reference
# global
#---------------------------------------------------------------------
"""
NOTE :
Attention, Les variables avant la fonction sont accessibles dans la fonction.
"""
a = 5
def print_a():
"""Fonction chargée d'afficher la variable a.
Cette variable a n'est pas passée en paramètre de la fonction.
On suppose qu'elle a été créée en dehors de la fonction, on veut voir
si elle est accessible depuis le corps de la fonction"""
print("La variable a = {0}.".format(a))
print_a()
#La variable a = 5.
a = 8
print_a()
#La variable a = 8.
print("----")
#---------------------------------------------------------------------
def set_var(nouvelle_valeur):
"""Fonction nous permettant de tester la portée des variables
définies dans notre corps de fonction"""
# On essaye d'afficher la variable var, si elle existe
try:
print("Avant l'affectation, notre variable var vaut {0}.".format(var))
except NameError:
print("La variable var n'existe pas encore.")
var = nouvelle_valeur
print("Après l'affectation, notre variable var vaut {0}.".format(var))
set_var(5)
#print(var) # Renvoie un erreur (normal) car var est local à la fonction.
print("----")
#---------------------------------------------------------------------
"""
Dans le corps de fonction, si vous faites "parametre = nouvelle_valeur",
le paramètre ne sera modifié que dans le corps de la fonction.
Alors que si vous faites "parametre.methode_pour_modifier(…)", l'objet derrière le paramètre sera bel et bien modifié.
"""
def ajouter(liste, valeur_a_ajouter):
"""Cette fonction insère à la fin de la liste la valeur que l'on veut ajouter"""
liste.append(valeur_a_ajouter)
ma_liste=['a', 'e', 'i']
ajouter(ma_liste, 'o')
print(ma_liste)
#['a', 'e', 'i', 'o']
print("----")
#---------------------------------------------------------------------
# Reference
"""
LIST :
"ma_liste1" et "ma_liste2" contiennent une référence vers le même objet :
si on modifie l'objet depuis une des deux variables, le changement sera visible depuis les deux variables.
INT, FLOAT, STRING :
Les entiers, les flottants, les chaînes de caractères, n'ont aucune méthode travaillant sur l'objet lui-même.
Les chaînes de caractères, comme nous l'avons vu, ne modifient pas l'objet appelant mais renvoient un nouvel objet
modifié.
Et comme nous venons de le voir, le processus d'affectation n'est pas du tout identique à un appel de méthode.
"""
print("# LIST (reference) :")
ma_liste1 = [1, 2, 3]
ma_liste2 = ma_liste1
ma_liste2.append(4)
print(ma_liste2)
#[1, 2, 3, 4]
print(ma_liste1)
#[1, 2, 3, 4]
print("----")
#---------------------------------------------------------------------
# COPIER UNE "LIST"
print("# LIST (copy) :")
ma_liste1 = [1, 2, 3]
ma_liste2 = list(ma_liste1) # Cela revient à copier le contenu de ma_liste1
ma_liste2.append(4)
print(ma_liste2)
#[1, 2, 3, 4]
print(ma_liste1)
#[1, 2, 3]
print("----")
#---------------------------------------------------------------------
# DICT : idem que pour une LIST. Sera passé en référence.
print("# DICT (reference) :")
mon_dictionnaire1 = {"pseudo":"Prolixe", "mdp": "*", "pseudo":"6pril"}
mon_dictionnaire2 = mon_dictionnaire1
mon_dictionnaire2['toto'] = "titi"
print(mon_dictionnaire1)
print(mon_dictionnaire2)
print("----")
#---------------------------------------------------------------------
# COPIER UN "DICT"
print("# DICT (copy) :")
mon_dictionnaire1 = {"pseudo":"Prolixe", "mdp": "*", "pseudo":"6pril"}
mon_dictionnaire2 = dict(mon_dictionnaire1) # Cela revient à copier le contenu de mon_dictionnaire1
mon_dictionnaire2['toto'] = "titi"
print(mon_dictionnaire1)
print(mon_dictionnaire2)
print("----")
#---------------------------------------------------------------------
ma_liste1 = [1, 2]
ma_liste2 = [1, 2]
print("ma_liste1 et ma_liste2 ont le meme contenu : ",ma_liste1 == ma_liste2) # On compare le contenu des listes
#True
print("ma_liste1 et ma_liste2 n'ont pas la meme reference : ",ma_liste1 is ma_liste2) # On compare leur référence
#False
print("id() Renvoie la position de l'objet dans la mémoire Python sous la forme d'un entier :")
print("---->",id(ma_liste1))
print("---->",id(ma_liste2))
help(id)
#---------------------------------------------------------------------
i = 4 # Une variable, nommée i, contenant un entier
def inc_i():
"""Fonction chargée d'incrémenter i de 1"""
global i # Python recherche i en dehors de l'espace local de la fonction
i += 1
print(i)
#4
inc_i()
print(i)
#5
#---------------------------------------------------------------------
"""
CONCLUSION :
1/ Les variables locales définies avant l'appel d'une fonction seront accessibles, depuis le corps de la fonction, en lecture seule.
2/ Une variable locale définie dans une fonction sera supprimée après l'exécution de cette fonction.
3/ On peut cependant appeler les attributs et méthodes d'un objet pour le modifier durablement.
4/ Les variables globales se définissent à l'aide du mot-clé "global" suivi du nom de la variable préalablement créée.
5/ Les variables globales peuvent être modifiées depuis le corps d'une fonction (à utiliser avec prudence).
"""
#---------------------------------------------------------------------
input("Appuyez sur ENTREE pour fermer ce programme...")