Prenons à nouveau note. J'ai fait une liste bidimensionnelle 3x3.
# Comme ça
print(tmp)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Donc, quand j'ai essayé de mettre "5" au milieu, c'est devenu comme ça. Pourquoi?
# Comme ça
tmp[1][1] = 5
print(tmp)
[[0, 5, 0], [0, 5, 0], [0, 5, 0]]
Quoi ça···
C'était parce que je ne pensais pas profondément quand je l'ai fait.
# Mauvais exemple
tmp_ng =[[0] * 3] * 3
print(tmp_ng)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Très bien, OK! (* Pas OK ...)
# Exemple d'amélioration
tmp_ok = [[0] * 3 for _ in range(3)]
print(tmp_ok)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Cela ne change pas à ce stade, mais ... Ce sera comme ça.
tmp_ng[1][1] = 5
print(tmp_ng)
[[0, 5, 0], [0, 5, 0], [0, 5, 0]]
tmp_ok[1][1] = 5
print(tmp_ok)
[[0, 0, 0], [0, 5, 0], [0, 0, 0]]
>>> tmp_ok[0] == tmp_ok[2]
True
>>> tmp_ng[0] == tmp_ng[2]
True
>>> tmp_ok[0] is tmp_ok[2]
False
>>> tmp_ng[0] is tmp_ng[2]
True
Dans un mauvais exemple, l'objet (?) [0] * 3 créé par new (en C #) est positionné à 3 endroits. En d'autres termes, un tableau est créé dans lequel la variable est définie une fois et l'emplacement alloué en mémoire est référencé trois fois. Par conséquent, un type de valeur apparaît à trois endroits. Cependant, dans l'exemple d'amélioration, [0] * 3 est nouveau (en C #) chaque fois que le for _ in range (3) est tourné 3 fois. Puisque la mémoire est sécurisée 3 fois, chacun peut avoir une valeur différente.
Je vois. .. ..
Vous ne pouvez pas dire que vous pouvez écrire Python à moins de reconnaître naturellement la signification de chaque caractère littéral, en particulier la commande de contrôle ...
Recommended Posts