В первом примере вы создаете новый массив со значением [[0,1], 1]. Затем вы переназначаете a
для обращения к этому массиву.
Во втором примере вы не создаете новый массив и не меняете то, к чему относится a
. Вы изменяете существующий массив , чтобы он содержал ссылку на себя. Это совсем другое.
Подробнее
Первый пример примерно эквивалентен этому коду:
a = [0, 1] # Step 1
b = [a, 1] # Step 2
a = b # Step 3
На картинках это выглядит так:
---
|a|
---
|
v
[0, 1]
- Шаг 2 - создайте еще один массив, который включает ссылку на первый:
--- ---
|a| |b|
--- ---
| |
| v
| [ref, 1]
| |
+------------+
v
[0, 1]
- Шаг 3 - измените
a
так, чтобы он указывал на массив, созданный на шаге 2:
--- ---
|a| |b|
--- ---
| |
+----------+
v
[ref, 1]
|
+-------------+
v
[0, 1]
С другой стороны, код во втором примере дает вам следующее:
---
|a|
---
|
+---+
| v
| [ref, 1]
| |
+-----+
Здесь все еще только один массив, и a
все еще указывает на него. Но теперь первый элемент в массиве относится к самому массиву.