tgoop.com/pro_python_code/1811
Create:
Last Update:
Last Update:
🐍 Хитрая задача на Python для опытных разработчиков
🔹 Уровень: Advanced
🔹 Темы: изменяемые объекты, ссылки, list multiplication, side effects
📌 Условие
Что выведет следующий код?
matrix = [[0] * 3] * 3
matrix[0][0] = 1
for row in matrix:
print(row)
❓ Вопросы
1. Почему изменяется весь первый столбец, а не только
[0][0]
? 2. Как работает
[[0]*3]*3
и почему это опасно? 3. Как правильно создать независимую матрицу 3×3 из нулей?
🔍 Разбор
✅ Ожидаемый (и удивительный!) вывод:
[1, 0, 0]
[1, 0, 0]
[1, 0, 0]
🔧 Почему так происходит
- Выражение
[[0] * 3] * 3
создаёт три ссылки на один и тот же вложенный список.-
matrix[0][0] = 1
меняет все строки, потому что они указывают на один и тот же объект в памяти.⚠️ Подвох
Это один из самых частых скрытых багов в Python, особенно при создании вложенных списков.
🧠 Решение
Нужно использовать генератор списка, чтобы создать три независимых объекта:
matrix = [[0] * 3 for _ in range(3)]
Теперь
matrix[0][0] = 1
затронет только первую строку:
[1, 0, 0]
[0, 0, 0]
[0, 0, 0]
📌 Всегда проверяй, создаёшь ли ты уникальные объекты, особенно если работаешь с вложенными структурами.
BY Python RU
Share with your friend now:
tgoop.com/pro_python_code/1811