Machen wir uns noch einmal eine Notiz. Ich habe eine zweidimensionale 3x3-Liste erstellt.
# So was
print(tmp)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Als ich versuchte, "5" in die Mitte zu setzen, wurde es so. Warum?
# So was
tmp[1][1] = 5
print(tmp)
[[0, 5, 0], [0, 5, 0], [0, 5, 0]]
Was das ···
Es war, weil ich nicht tief nachgedacht habe, als ich es gemacht habe.
# Schlechtes Beispiel
tmp_ng =[[0] * 3] * 3
print(tmp_ng)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Okay, OK! (* Nicht OK ...)
# Verbesserungsbeispiel
tmp_ok = [[0] * 3 for _ in range(3)]
print(tmp_ok)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Es ändert sich an dieser Stelle nicht, aber ... Es wird so sein.
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
In einem schlechten Beispiel wird das von new (in C #) erstellte Objekt (?) [0] * 3 an drei Stellen festgelegt. Mit anderen Worten wird ein Array erstellt, in dem die Variable einmal definiert wird und auf den zugewiesenen Speicherort dreimal verwiesen wird. Daher wird ein Werttyp an drei Stellen angezeigt. Im Verbesserungsbeispiel ist [0] * 3 jedoch jedes Mal neu (in C #), wenn der Bereich für _ in (3) dreimal gedreht wird. Da der Speicher dreimal gesichert ist, kann jeder einen anderen Wert haben.
Das war's. .. ..
Ich kann nicht sagen, dass ich Python schreiben kann, es sei denn, ich kann natürlich die Bedeutung jedes Zeichenliteral erkennen, insbesondere den Steuerbefehl.
Recommended Posts