J'ai essayé d'utiliser plusieurs affectations comme indiqué ci-dessous pour initialiser les variables, mais j'ai été confus par le comportement, je m'attends à réaffecter la liste de valeurs séparément, je veux dire que b [0] et c [0] égalent 0 comme avant.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
Le résultat est: [1, 3, 5] [1, 3, 5] [1, 3, 5]
Est-ce exact? que dois-je utiliser pour les affectations multiples? qu'est-ce qui est différent de cela?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
résultat: ('f:', 3) ('e:', 4)
a
,b
etc,
à tous les points à la même valeur (dans ce cas , une liste), ou voulez - vousa=0
,b=3
etc=5
. Dans ce cas, vous vouleza,b,c = [0,3,5]
ou tout simplementa,b,c = 0,3,5
.Réponses:
Si vous arrivez à Python à partir d'un langage du C / Java / etc. famille, cela peut vous aider à arrêter de penser à
a
une «variable» et à commencer à y penser comme un «nom».a
,b
etc
ne sont pas des variables différentes avec des valeurs égales; ce sont des noms différents pour la même valeur identique. Les variables ont des types, des identités, des adresses et toutes sortes de choses comme ça.Les noms n'ont rien de tout cela. Les valeurs le font, bien sûr, et vous pouvez avoir beaucoup de noms pour la même valeur.
Si vous offrez
Notorious B.I.G.
un hot-dog *Biggie Smalls
etChris Wallace
un hot-dog. Si vous remplacez le premier élément dea
par 1, les premiers éléments deb
etc
sont 1.Si vous voulez savoir si deux noms nomment le même objet, utilisez l'
is
opérateur:Vous demandez alors:
Ici, vous reliez le nom
e
à la valeur4
. Cela ne touche pas les nomsd
etf
en aucune façon.Dans votre version précédente, vous attribuiez à
a[0]
, pas àa
. Donc, du point de vue dea[0]
, vous relieza[0]
, mais du point de vue dea
, vous le modifiez sur place.Vous pouvez utiliser la
id
fonction, qui vous donne un numéro unique représentant l'identité d'un objet, pour voir exactement quel objet est lequel même siis
cela ne peut pas aider:Notez que cela
a[0]
est passé de 4297261120 à 4297261216 - c'est maintenant un nom pour une valeur différente. Etb[0]
est également maintenant un nom pour cette même nouvelle valeur. C'est parce quea
etb
continuent de nommer le même objet.Sous les couvertures,
a[0]=1
appelle en fait une méthode sur l'objet de liste. (C'est équivalent àa.__setitem__(0, 1)
.) Donc, ce n'est vraiment rien du tout. C'est comme appelermy_object.set_something(1)
. Bien sûr, l'objet est probablement en train de relier un attribut d'instance afin d'implémenter cette méthode, mais ce n'est pas ce qui est important; ce qui est important, c'est que vous n'attribuez rien, vous faites simplement muter l'objet. Et c'est la même chose aveca[0]=1
.user570826 a demandé:
C'est exactement la même situation que
a = b = c = [1, 2, 3]
: vous avez trois noms pour la même valeur.Mais dans ce cas, la valeur est an
int
etint
s sont immuables. Dans les deux cas, vous pouvez associera
à une valeur différente (par exemplea = "Now I'm a string!"
), mais n'affectera pas la valeur initiale, quib
etc
sera toujours des noms pour. La différence est qu'avec une liste, vous pouvez changer la valeur[1, 2, 3]
en[1, 2, 3, 4]
faisant, par exemplea.append(4)
,; puisque cela change en fait la valeur pour laquelleb
etc
sont des noms,b
va maintenant b[1, 2, 3, 4]
. Il n'y a aucun moyen de changer la valeur10
en autre chose.10
a 10 pour toujours, tout comme Claudia la vampire a 5 pour toujours (du moins jusqu'à ce qu'elle soit remplacée par Kirsten Dunst).* Attention: ne donnez pas à Notorious BIG un hot-dog. Les zombies de gangsta rap ne devraient jamais être nourris après minuit.
la source
have, a = b = c = 10;
et quand nous essayons de mettre à jour la valeur de b, cela affecte tout autre? bien que j'ai vérifié leurs identifiants sont les mêmes.?10
est immuable - cela signifie qu'il n'y a aucun moyen de mettre à jour la valeur, donc votre question n'a pas de sens. Vous pouvez pointerb
sur une valeur différente, mais cela n'a aucun effet sura
etc
, qui pointent toujours vers la valeur d'origine. La différence qu'apportent les listes est qu'elles sont modifiables. Par exemple, vous pouvez créerappend
une liste oulst[0] = 3
, et cela mettra à jour la valeur, qui sera visible à travers tous les noms de cette valeur.Tousse tousse
la source
a,b,c = 1,2,3
sans crochets fonctionne en Python 2 ou 3, si vous voulez vraiment ce cm supplémentaire de lisibilité.Oui, c'est le comportement attendu. a, b et c sont tous définis comme étiquettes pour la même liste. Si vous voulez trois listes différentes, vous devez les attribuer individuellement. Vous pouvez soit répéter la liste explicite, soit utiliser l'une des nombreuses façons de copier une liste:
Les instructions d'affectation en Python ne copient pas les objets - elles lient le nom à un objet et un objet peut avoir autant d'étiquettes que vous en définissez. Lors de votre première modification, en changeant un [0], vous mettez à jour un élément de la liste unique auquel a, b et c font tous référence. Dans votre deuxième, en changeant e, vous changez e pour être une étiquette pour un objet différent (4 au lieu de 3).
la source
En python, tout est un objet, aussi des types de variables "simples" (int, float, etc.).
Lorsque vous modifiez la valeur d'une variable, vous modifiez en fait son pointeur , et si vous comparez entre deux variables, il compare leurs pointeurs . (Pour être clair, le pointeur est l'adresse dans la mémoire physique de l'ordinateur où une variable est stockée).
Par conséquent, lorsque vous modifiez une valeur de variable interne, vous modifiez sa valeur dans la mémoire et cela affecte toutes les variables qui pointent vers cette adresse.
Pour votre exemple, lorsque vous faites:
Cela signifie que a et b pointe vers la même adresse en mémoire qui contient la valeur 5, mais lorsque vous faites:
Cela n'affecte pas b car a est maintenant pointe vers un autre emplacement mémoire qui contient 6 et b pointe toujours vers l'adresse mémoire qui contient 5.
Mais, quand vous faites:
a et b, encore une fois, indiquent le même emplacement, mais la différence est que si vous modifiez l'une des valeurs de la liste:
Cela change la valeur de la mémoire sur laquelle pointe a is, mais a is pointe toujours vers la même adresse que b, et par conséquent, b change également.
la source
PyObject
. Ce n'est pas vrai dans d'autres implémentations comme PyPy ou Jython. (En fait, on ne sait même pas comment cela pourrait être vrai, car les langages dans lesquels ces implémentations sont écrites n'ont même pas de pointeurs.)Vous pouvez utiliser
id(name)
pour vérifier si deux noms représentent le même objet:Les listes sont modifiables; cela signifie que vous pouvez modifier la valeur en place sans créer un nouvel objet. Cependant, cela dépend de la façon dont vous modifiez la valeur:
Si vous attribuez une nouvelle liste
a
, puis son id va changer, donc il ne sera pas affecterb
etc
de valeurs:Les entiers sont immuables, vous ne pouvez donc pas modifier la valeur sans créer un nouvel objet:
la source
id
n'est pas nécessairement un emplacement mémoire. Comme le disent les documents , cela renvoie «l'identité… un entier… qui est garanti unique et constant pour cet objet pendant sa durée de vie». CPython utilise l'adresse mémoire comme adresseid
, mais d'autres implémentations Python peuvent ne pas le faire. PyPy, par exemple, ne le fait pas. Et dire "deux vars pointent vers le même emplacement mémoire" est trompeur pour quiconque comprend le style C. «Deux noms pour le même objet» est à la fois plus précis et moins trompeur.dans votre premier exemple,
a = b = c = [1, 2, 3]
vous dites vraiment:Si vous voulez définir 'a' égal à 1, 'b' égal à '2' et 'c' égal à 3, essayez ceci:
J'espère que cela t'aides!
la source
En termes simples, dans le premier cas, vous attribuez plusieurs noms à un
list
. Une seule copie de la liste est créée en mémoire et tous les noms font référence à cet emplacement. Ainsi, changer la liste en utilisant l'un des noms modifiera en fait la liste en mémoire.Dans le second cas, plusieurs copies de même valeur sont créées en mémoire. Ainsi, chaque copie est indépendante l'une de l'autre.
la source
Voici ce dont vous avez besoin:
la source
Le code qui fait ce dont j'ai besoin pourrait être le suivant:
Résultat:
la source