J'ai deux dictionnaires Python et je veux écrire une seule expression qui renvoie ces deux dictionnaires, fusionnés. La update()
méthode serait ce dont j'ai besoin, si elle retournait son résultat au lieu de modifier un dictionnaire sur place.
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{'a': 1, 'b': 10, 'c': 11}
Comment puis-je obtenir ce dictionnaire fusionné final z
, non x
?
(Pour être plus clair, le dernier qui remporte la gestion des conflits dict.update()
est ce que je recherche également.)
python
dictionary
merge
Carl Meyer
la source
la source
z = x | y
Réponses:
Pour les dictionnaires
x
ety
,z
devient un dictionnaire peu fusionné avec des valeurs dey
remplacement de celles dex
.En Python 3.5 ou supérieur:
En Python 2, (ou 3.4 ou inférieur), écrivez une fonction:
et maintenant:
En Python 3.9.0a4 ou supérieur (date de sortie finale vers octobre 2020): PEP-584 , discuté ici , a été implémenté pour simplifier davantage ceci:
Explication
Supposons que vous ayez deux dicts et que vous souhaitiez les fusionner dans un nouveau dict sans modifier les dictons originaux:
Le résultat souhaité est d'obtenir un nouveau dictionnaire (
z
) avec les valeurs fusionnées et les valeurs du second dict écrasant celles du premier.Une nouvelle syntaxe pour cela, proposée dans PEP 448 et disponible à partir de Python 3.5 , est
Et c'est en effet une seule expression.
Notez que nous pouvons également fusionner avec la notation littérale:
et maintenant:
Il apparaît maintenant comme implémenté dans le calendrier de sortie de la version 3.5, PEP 478 , et il a maintenant fait son chemin dans Quoi de neuf dans Python 3.5 .
Cependant, étant donné que de nombreuses organisations sont toujours sur Python 2, vous souhaiterez peut-être le faire de manière rétrocompatible. La manière classique Pythonic, disponible dans Python 2 et Python 3.0-3.4, est de le faire en deux étapes:
Dans les deux approches,
y
viendra en second et ses valeurs remplacerontx
les valeurs de,'b'
indiqueront donc3
dans notre résultat final.Pas encore sur Python 3.5, mais vous voulez un seule expression
Si vous n'êtes pas encore sur Python 3.5, ou avez besoin d'écrire du code rétrocompatible, et que vous le souhaitez dans une seule expression , l'approche la plus performante et correcte est de le mettre dans une fonction:
et puis vous avez une seule expression:
Vous pouvez également créer une fonction pour fusionner un nombre indéfini de dictés, de zéro à un très grand nombre:
Cette fonction fonctionnera en Python 2 et 3 pour tous les dict. par exemple donné des dits
a
àg
:et les paires de valeurs clés dans
g
auront priorité sur les ditsa
def
, etc.Critiques d'autres réponses
N'utilisez pas ce que vous voyez dans la réponse précédemment acceptée:
Dans Python 2, vous créez deux listes en mémoire pour chaque dict, créez une troisième liste en mémoire avec une longueur égale à la longueur des deux premières réunies, puis supprimez les trois listes pour créer le dict. En Python 3, cela échouera car vous ajoutez deux
dict_items
objets ensemble, pas deux listes -et vous devrez les créer explicitement sous forme de listes, par exemple
z = dict(list(x.items()) + list(y.items()))
. C'est un gaspillage de ressources et de puissance de calcul.De même, la prise de l'union de
items()
dans Python 3 (viewitems()
dans Python 2.7) échouera également lorsque les valeurs sont des objets non partageables (comme des listes, par exemple). Même si vos valeurs sont hachables, puisque les ensembles ne sont pas sémantiquement ordonnés, le comportement n'est pas défini en ce qui concerne la priorité. Alors ne fais pas ça:Cet exemple montre ce qui se passe lorsque les valeurs ne sont pas partageables:
Voici un exemple où y devrait avoir la priorité, mais à la place la valeur de x est conservée en raison de l'ordre arbitraire des ensembles:
Un autre hack que vous ne devriez pas utiliser:
Cela utilise le
dict
constructeur, et est très rapide et efficace en mémoire (même un peu plus que notre processus en deux étapes), mais à moins que vous ne sachiez précisément ce qui se passe ici (c'est-à-dire que le deuxième dict est transmis en tant qu'arguments de mot-clé au dict constructeur), il est difficile à lire, ce n'est pas l'usage prévu, et donc ce n'est pas Pythonic.Voici un exemple d'utilisation corrigée dans django .
Les dictés sont destinés à prendre des clés lavables (par exemple des ensembles de frozensets ou des tuples), mais cette méthode échoue en Python 3 lorsque les clés ne sont pas des chaînes.
De la liste de diffusion , Guido van Rossum, le créateur de la langue, a écrit:
et
D'après ce que je comprends (ainsi que la compréhension du créateur de la langue ), l'utilisation prévue
dict(**y)
est de créer des dits à des fins de lisibilité, par exemple:au lieu de
Réponse aux commentaires
Encore une fois, cela ne fonctionne pas pour 3 lorsque les clés ne sont pas des chaînes. Le contrat d'appel implicite est que les espaces de noms prennent des dicts ordinaires, tandis que les utilisateurs doivent uniquement passer des arguments de mots clés qui sont des chaînes. Tous les autres callables l'ont appliqué.
dict
rompu cette cohérence dans Python 2:Cette incohérence était mauvaise compte tenu des autres implémentations de Python (Pypy, Jython, IronPython). Ainsi, il a été corrigé dans Python 3, car cette utilisation pourrait être un changement de rupture.
Je vous soumets qu'il est de l'incompétence malveillante d'écrire intentionnellement du code qui ne fonctionne que dans une seule version d'un langage ou qui ne fonctionne que compte tenu de certaines contraintes arbitraires.
Plus de commentaires:
Ma réponse: en
merge_two_dicts(x, y)
fait, cela me semble beaucoup plus clair, si nous sommes réellement préoccupés par la lisibilité. Et il n'est pas compatible en aval, car Python 2 est de plus en plus obsolète.Oui. Je dois vous renvoyer à la question, qui demande une fusion superficielle de deux dictionnaires, les valeurs du premier étant écrasées par le second - en une seule expression.
En supposant deux dictionnaires de dictionnaires, l'un pourrait les fusionner récursivement en une seule fonction, mais vous devez faire attention à ne pas modifier les dict à partir de l'une ou l'autre source, et le moyen le plus sûr d'éviter cela est de faire une copie lors de l'attribution des valeurs. Les clés devant être lavables et donc généralement immuables, il est inutile de les copier:
Usage:
Venir avec des contingences pour d'autres types de valeur est bien au-delà de la portée de cette question, donc je vais vous pointer vers ma réponse à la question canonique sur un "Fusion de dictionnaires de dictionnaires" .
Ad-hocs moins performants mais corrects
Ces approches sont moins performantes, mais elles fourniront un comportement correct. Ils seront beaucoup moins performants que
copy
etupdate
ou le nouveau déballage car ils parcourent chaque paire clé-valeur à un niveau d'abstraction plus élevé, mais ils le font respectent l'ordre de préséance ( celui- ci dicts ont priorité)Vous pouvez également chaîner les dict manuellement dans une compréhension de dict:
ou en python 2.6 (et peut-être dès 2.4 lorsque les expressions de générateur ont été introduites):
itertools.chain
enchaînera les itérateurs sur les paires clé-valeur dans le bon ordre:Analyse de performance
Je vais seulement faire l'analyse des performances des usages connus pour se comporter correctement.
Ce qui suit se fait sur Ubuntu 14.04
En Python 2.7 (système Python):
En Python 3.5 (PPA des serpents morts):
Ressources sur les dictionnaires
la source
{**{(0, 1):2}}
->{(0, 1): 2}
z = {**x, **y}
vraiment me stimulerx | y
Dans votre cas, vous pouvez:
Cela, comme vous le souhaitez, mettra le dict final
z
et fera en sorte que la valeur de keyb
soit correctement remplacée par la valeur du second (y
) dict:Si vous utilisez Python 3, c'est seulement un peu plus compliqué. Pour créer
z
:Si vous utilisez Python version 3.9.0a4 ou supérieure, vous pouvez directement utiliser:
la source
Une alternative:
la source
Update
n'est pas l'une des fonctions «essentielles» que les gens ont tendance à utiliser beaucoup.(lambda z: z.update(y) or z)(x.copy())
: PUne autre option, plus concise:
Remarque : cela est devenu une réponse populaire, mais il est important de souligner que s'il y
y
a des clés non-chaîne, le fait que cela fonctionne du tout est un abus d'un détail d'implémentation CPython, et cela ne fonctionne pas dans Python 3, ou en PyPy, IronPython ou Jython. De plus, Guido n'est pas fan . Je ne peux donc pas recommander cette technique pour le code portable à compatibilité ascendante ou à implémentation croisée, ce qui signifie vraiment qu'elle devrait être évitée complètement.la source
Ce ne sera probablement pas une réponse populaire, mais vous ne voulez certainement pas faire cela. Si vous voulez une copie qui est une fusion, utilisez la copie (ou la copie profonde , selon ce que vous voulez), puis mettez à jour. Les deux lignes de code sont beaucoup plus lisibles - plus Pythonic - que la création d'une seule ligne avec .items () + .items (). Explicite vaut mieux qu'implicite.
De plus, lorsque vous utilisez .items () (avant Python 3.0), vous créez une nouvelle liste qui contient les éléments du dict. Si vos dictionnaires sont volumineux, cela représente beaucoup de frais généraux (deux grandes listes qui seront supprimées dès que le dict fusionné sera créé). update () peut fonctionner plus efficacement, car il peut parcourir le deuxième dict élément par élément.
En termes de temps :
IMO le minuscule ralentissement entre les deux premiers en vaut la peine pour la lisibilité. De plus, les arguments de mots clés pour la création de dictionnaire n'ont été ajoutés qu'en Python 2.3, tandis que copy () et update () fonctionneront dans les anciennes versions.
la source
Dans une réponse de suivi, vous avez posé des questions sur les performances relatives de ces deux alternatives:
Sur ma machine, au moins (un x86_64 assez ordinaire exécutant Python 2.5.2), l'alternative
z2
est non seulement plus courte et plus simple mais aussi beaucoup plus rapide. Vous pouvez le vérifier par vous-même en utilisant letimeit
module fourni avec Python.Exemple 1: dictionnaires identiques mappant 20 entiers consécutifs sur eux-mêmes:
z2
gagne par un facteur de 3,5 ou plus. Différents dictionnaires semblent donner des résultats assez différents, maisz2
semblent toujours venir en tête. (Si vous obtenez des résultats incohérents pour le même test, essayez de passer-r
avec un nombre supérieur au 3. par défaut.)Exemple 2: dictionnaires sans chevauchement mappant 252 chaînes courtes en entiers et vice versa:
z2
gagne par un facteur d'environ 10. C'est une très grosse victoire dans mon livre!Après avoir comparé ces deux, je me suis demandé si
z1
les mauvaises performances pouvaient être attribuées aux frais généraux de construction des deux listes d'articles, ce qui m'a amené à me demander si cette variation pourrait mieux fonctionner:Quelques tests rapides, par exemple
amène à conclure que
z3
c'est un peu plus rapide quez1
, mais pas aussi vite quez2
. Certainement pas la peine de taper tous les caractères supplémentaires.Il manque encore quelque chose d'important à cette discussion, qui est une comparaison des performances de ces alternatives avec la manière "évidente" de fusionner deux listes: en utilisant la
update
méthode. Pour essayer de garder les choses sur un pied d'égalité avec les expressions, dont aucune ne modifie x ou y, je vais faire une copie de x au lieu de la modifier en place, comme suit:Un résultat typique:
En d'autres termes,
z0
etz2
semblent avoir des performances essentiellement identiques. Pensez-vous que cela pourrait être une coïncidence? Je ne....En fait, j'irais jusqu'à prétendre qu'il est impossible pour le code Python pur de faire mieux que cela. Et si vous pouvez faire beaucoup mieux dans un module d'extension C, j'imagine que les gens de Python pourraient bien être intéressés à incorporer votre code (ou une variation de votre approche) dans le noyau Python. Python utilise
dict
dans de nombreux endroits; l'optimisation de ses opérations est un gros problème.Vous pouvez également écrire ceci comme
comme Tony le fait, mais (sans surprise) la différence de notation se révèle n'avoir aucun effet mesurable sur les performances. Utilisez celui qui vous convient. Bien sûr, il a absolument raison de souligner que la version à deux déclarations est beaucoup plus facile à comprendre.
la source
items()
n'est pas catenable etiteritems
n'existe pas.Dans Python 3.0 et
collections.ChainMap
versions ultérieures , vous pouvez utiliser les groupes qui regroupent plusieurs dictés ou autres mappages pour créer une seule vue pouvant être mise à jour:Mise à jour pour Python 3.5 et versions ultérieures : vous pouvez utiliser la compression et la décompression du dictionnaire étendu PEP 448 . C'est simple et rapide:
la source
del
on, un ChainMap c supprimera le premier mappage de cette clé.dict
éviter cela, c'est-à-dire:dict(ChainMap({}, y, x))
Je voulais quelque chose de similaire, mais avec la possibilité de spécifier comment les valeurs des clés en double ont été fusionnées, j'ai donc piraté cela (mais je ne l'ai pas testé de manière intensive). Évidemment, ce n'est pas une expression unique, mais c'est un appel de fonction unique.
la source
Mettre à jour récursivement / en profondeur un dict
Manifestation:
Les sorties:
Merci rednaw pour les modifications.
la source
La meilleure version que je pourrais penser sans utiliser la copie serait:
C'est plus rapide
dict(x.items() + y.items())
mais pas aussi rapide quen = copy(a); n.update(b)
, du moins sur CPython. Cette version fonctionne également en Python 3 si vous passeziteritems()
àitems()
, ce qui est automatiquement fait par l'outil 2to3.Personnellement, je préfère cette version car elle décrit assez bien ce que je veux dans une seule syntaxe fonctionnelle. Le seul problème mineur est qu'il ne rend pas complètement évident que les valeurs de y ont priorité sur les valeurs de x, mais je ne pense pas qu'il soit difficile de comprendre cela.
la source
Python 3.5 (PEP 448) permet une option de syntaxe plus agréable:
Ou même
Dans Python 3.9, vous utilisez également | et | = avec l'exemple ci-dessous de PEP 584
la source
dict(x, **y)
-s? Comme vous (@CarlMeyer) l'avez mentionné dans la note de votre propre réponse ( stackoverflow.com/a/39858/2798610 ), Guido considère cette solution comme illégale .dict(x, **y)
pour la (très bonne) raison pour laquelle il s'appuiey
uniquement sur des clés qui sont des noms d'argument de mot clé valides (sauf si vous utilisez CPython 2.7, où le constructeur dict triche). Cette objection / restriction ne s'applique pas au PEP 448, qui généralise la**
syntaxe de décompression pour dicter des littéraux. Cette solution a donc la même concision quedict(x, **y)
, sans inconvénient.Pour les éléments avec des clés dans les deux dictionnaires («b»), vous pouvez contrôler celui qui se retrouve dans la sortie en mettant celui-ci en dernier.
la source
Bien que la question ait déjà reçu plusieurs réponses, cette solution simple au problème n'a pas encore été répertoriée.
Il est aussi rapide que z0 et le mal z2 mentionné ci-dessus, mais facile à comprendre et à changer.
la source
z4 = {}
et changez la ligne suivante enz4 = x.copy()
- mieux qu'un bon code ne fait pas de choses inutiles (ce qui le rend encore plus lisible et maintenable).Parmi ces réponses louches et douteuses, cet exemple brillant est le seul et unique bon moyen de fusionner des textes en Python, approuvé par le dictateur à vie Guido van Rossum lui-même! Quelqu'un d'autre a suggéré la moitié de cela, mais ne l'a pas mis dans une fonction.
donne:
la source
Si vous pensez que les lambdas sont mauvais, ne lisez pas plus loin. Comme demandé, vous pouvez écrire la solution rapide et efficace en mémoire avec une seule expression:
Comme suggéré ci-dessus, utiliser deux lignes ou écrire une fonction est probablement une meilleure façon de procéder.
la source
Soyez pythonique. Utilisez une compréhension :
la source
def dictmerge(*args): return {i:d[i] for d in args for i in d}
z={k: v for d in (x, y) for k, v in d.items()}
En python3, la
items
méthode ne renvoie plus une liste , mais plutôt une vue , qui agit comme un ensemble. Dans ce cas, vous devrez prendre l'union définie car la concaténation avec+
ne fonctionnera pas:Pour un comportement semblable à python3 dans la version 2.7, la
viewitems
méthode devrait fonctionner à la place deitems
:Je préfère de toute façon cette notation car il semble plus naturel de la considérer comme une opération d'union d'ensemble plutôt que comme une concaténation (comme le titre le montre).
Éditer:
Quelques points supplémentaires pour python 3. Tout d'abord, notez que l'
dict(x, **y)
astuce ne fonctionnera pas en python 3 à moins que les clés ney
soient des chaînes.De plus, la réponse Chainmap de Raymond Hettinger est assez élégante, car elle peut prendre un nombre arbitraire de dict comme arguments, mais à partir des documents, il semble qu'elle regarde séquentiellement une liste de tous les dicts pour chaque recherche:
Cela peut vous ralentir si vous avez beaucoup de recherches dans votre application:
Donc, environ un ordre de grandeur plus lent pour les recherches. Je suis un fan de Chainmap, mais semble moins pratique où il peut y avoir de nombreuses recherches.
la source
Abus menant à une solution à une expression pour la réponse de Matthew :
Vous avez dit que vous vouliez une expression, j'ai donc abusé
lambda
de lier un nom et des tuples pour remplacer la limite d'une expression de lambda. N'hésitez pas à grincer des dents.Vous pouvez également le faire bien sûr si vous ne vous souciez pas de le copier:
la source
Solution simple utilisant itertools qui préserve l'ordre (les derniers dits ont la priorité)
Et c'est son utilisation:
la source
Deux dictionnaires
n dictionnaires
sum
a de mauvaises performances. Voir https://mathieularose.com/how-not-to-flatten-a-list-of-lists-in-python/la source
Même si les réponses étaient bonnes pour ce superficiel dictionnaire , aucune des méthodes définies ici ne fait réellement une fusion de dictionnaire approfondie.
Voici des exemples:
On pourrait s'attendre à un résultat de quelque chose comme ceci:
Au lieu de cela, nous obtenons ceci:
L'entrée «one» aurait dû avoir «depth_2» et «extra» comme éléments dans son dictionnaire si c'était vraiment une fusion.
L'utilisation de la chaîne ne fonctionne pas non plus:
Résulte en:
La fusion profonde que rcwesick a donnée crée également le même résultat.
Oui, cela fonctionnera pour fusionner les exemples de dictionnaires, mais aucun d'entre eux n'est un mécanisme générique pour fusionner. Je le mettrai à jour plus tard une fois que j'écrirai une méthode qui effectue une véritable fusion.
la source
(Pour Python2.7 * uniquement; il existe des solutions plus simples pour Python3 *.)
Si vous n'êtes pas opposé à l'importation d'un module de bibliothèque standard, vous pouvez le faire
(Le
or a
bit dans lelambda
est nécessaire cardict.update
il revient toujoursNone
sur le succès.)la source
Si cela ne vous dérange pas de muter
x
,Simple, lisible, performant. Vous savez
update()
toujours retourneNone
, ce qui est une fausse valeur. Ainsi, l'expression ci-dessus sera toujours évaluéex
après sa mise à jour.Les méthodes de mutation dans la bibliothèque standard (comme
.update()
) reviennentNone
par convention, donc ce modèle fonctionnera aussi sur celles-ci. Si vous utilisez une méthode qui ne respecte pas cette convention, celaor
peut ne pas fonctionner. Mais, vous pouvez utiliser un affichage et un index de tuple pour en faire une seule expression à la place. Cela fonctionne quel que soit le premier élément évalué.Si vous n'avez pas
x
encore de variable, vous pouvez utiliserlambda
pour créer un local sans utiliser une instruction d'affectation. Cela revient à utiliserlambda
comme une expression let , qui est une technique courante dans les langages fonctionnels, mais peut-être unpythonic.Bien que ce ne soit pas si différent de l'utilisation suivante du nouvel opérateur morse (Python 3.8+ uniquement):
Si vous voulez une copie, le style PEP 448 est plus simple
{**x, **y}
. Mais si ce n'est pas disponible dans votre (ancienne) version Python, le motif let fonctionne ici aussi.(C'est, bien sûr, équivalent à
(z := x.copy()).update(y) or z
, mais si votre version Python est suffisamment nouvelle pour cela, alors le style PEP 448 sera disponible.)la source
En m'appuyant sur des idées ici et ailleurs, j'ai compris une fonction:
Utilisation (testé en python 3):
Vous pouvez utiliser un lambda à la place.
la source
Le problème que j'ai avec les solutions répertoriées à ce jour est que, dans le dictionnaire fusionné, la valeur de la clé "b" est 10 mais, à mon avis, elle devrait être de 12. Dans cette optique, je présente ce qui suit:
Résultats:
la source
cytoolz.merge_with
( toolz.readthedocs.io/en/latest/… )C'est tellement idiot qui
.update
ne renvoie rien.J'utilise simplement une fonction d'assistance simple pour résoudre le problème:
Exemples:
la source
Cela devrait résoudre votre problème.
la source
Cela peut être fait avec une seule compréhension de dict:
À mon avis, la meilleure réponse pour la partie «expression unique» car aucune fonction supplémentaire n'est nécessaire, et elle est courte.
la source
Il y aura une nouvelle option lors de la sortie de Python 3.8 ( prévue pour le 20 octobre 2019 ), grâce à PEP 572: Expressions d'assignation . Le nouvel opérateur d'expression d'affectation
:=
vous permet d'affecter le résultat de lacopy
et de toujours l'utiliser pour appelerupdate
, en laissant au code combiné une seule expression, plutôt que deux instructions, en changeant:à:
tout en se comportant de manière identique dans tous les sens. Si vous devez également renvoyer le résultat
dict
(vous avez demandé une expression renvoyant ledict
; ce qui précède le crée et l'affectenewdict
, mais ne le renvoie pas, vous ne pouvez donc pas l'utiliser pour passer un argument à une fonction telle quelle, à la lamyfunc((newdict := dict1.copy()).update(dict2))
) , puis ajoutez simplementor newdict
à la fin (puisqueupdate
renvoieNone
, ce qui est faux, il évaluera et retournera ensuitenewdict
comme résultat de l'expression):Mise en garde importante: en général, je découragerais cette approche en faveur de:
L'approche de déballage est plus claire (pour quiconque connaît le déballage généralisé, ce que vous devriez faire ), ne nécessite aucun nom pour le résultat (il est donc beaucoup plus concis lors de la construction d'un temporaire qui est immédiatement transmis à un fonction ou inclus dans un
list
/tuple
littéral ou similaire), et est presque certainement plus rapide également, étant (sur CPython) à peu près équivalent à:mais fait à la couche C, en utilisant l'
dict
API concrète , donc pas de recherche / liaison de méthode dynamique ou de surcharge de répartition d'appel de fonction (où(newdict := dict1.copy()).update(dict2)
est inévitablement identique au comportement à deux lignes d'origine, effectuant le travail en étapes discrètes, avec une recherche dynamique / liaison / invocation de méthodes.Il est également plus extensible, car la fusion de trois
dict
s est évidente:où l'utilisation d'expressions d'affectation ne sera pas mise à l'échelle comme ça; le plus proche que vous pourriez obtenir serait:
ou sans le tuple temporaire de
None
s, mais avec des tests de véracité de chaqueNone
résultat:soit de ce qui est évidemment beaucoup plus laid, et comprend en outre l' inefficacité (soit un gaspillage temporaire
tuple
deNone
s pour la séparation de virgule, ou inutile test de truthiness de chacunupdate
d »None
échange deor
séparation).Le seul véritable avantage de l'approche de l'expression d'affectation se produit si:
set
s etdict
s (tous deux prennent en chargecopy
etupdate
, donc le code fonctionne à peu près comme vous vous y attendez)dict
lui - même, et vous devez conserver le type et la sémantique du côté gauche (plutôt que de vous retrouver avec un simpledict
). Bien que celamyspecialdict({**speciala, **specialb})
puisse fonctionner, cela impliquerait un temporaire supplémentairedict
, et simyspecialdict
des fonctionnalitésdict
ne peuvent pas être préservées (par exemple, lesdict
s réguliers préservent maintenant l'ordre en fonction de la première apparence d'une clé et la valeur en fonction de la dernière apparence d'une clé; celui qui préserve l'ordre basé sur le dernier apparence d'une clé, donc la mise à jour d'une valeur la déplace également à la fin), alors la sémantique serait erronée. Étant donné que la version de l'expression d'affectation utilise les méthodes nommées (qui sont probablement surchargées pour se comporter correctement), elle ne crée jamais undict
pas du tout (sauf sidict1
c'était déjà undict
), en préservant le type d'origine (et la sémantique du type d'origine), tout en évitant tout temporel.la source
la source
x
avec sa copie. Six
est un argument de fonction, cela ne fonctionnera pas (voir l' exemple )