Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 29.06.2023
Сообщений: 11

Не добавляется элемент в двумерный список

29.06.2023, 19:38. Показов 856. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите, почему в коде приведенном ниже, число 8 присваивается сразу нескольким элементам?
Python
1
2
3
4
5
6
7
n = int(input())
 
b = [0 for i in range(n)]
a = [b for k in range(n)]
 
a[0][0] = 8
print(a)
На выходе: [[8, 0, 0, 0], [8, 0, 0, 0], [8, 0, 0, 0], [8, 0, 0, 0]], вместо ожидаемого [[8, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2023, 19:38
Ответы с готовыми решениями:

Не добавляется следующий элемент в список
Надо по названию цвета упорядочить элементы списка и при добавлении сохранять упорядоченность. В имеющейся программе добавляется только...

Элемент экземпляра класса не добавляется в список
Здравствуйте, у меня возникла небольшая проблема: я создаю список класса, но при добавлении элемента списка, элемент не добавляется. ...

В односвязный список добавляется последний нулевой элемент
Здравствуйте, такая проблема, почему-то в список добавляется последний нулевой элемент, в чем может быть трабл ? скрин Вот...

9
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.06.2023, 19:49
Цитата Сообщение от Alexey2007 Посмотреть сообщение
a = [b for k in range(n)]
ссылку на 1 и тот же список создал н раз

Python
1
2
3
4
5
6
>>> arr = [[0]*4 for _ in range(4)]
>>> arr
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> arr[0][0]=8
>>> arr
[[8, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
0
0 / 0 / 0
Регистрация: 29.06.2023
Сообщений: 11
29.06.2023, 20:36  [ТС]
Благодарю за ответ и подсказку как грамотно написать. Но остался вопрос.
Допустим я добавлю двумерный список 'c'.
Python
1
2
3
4
5
6
7
8
n = 4
 
b = [0 for i in range(n)]
a = [b for k in range(n)]
# c = a
c = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
c[0][0] = 8
print(c)
В таком виде на выходе [[8, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Однако в коде:
Python
1
2
3
4
5
6
7
8
n = 4
 
b = [0 for i in range(n)]
a = [b for k in range(n)]
c = a # здесь всё также c = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
 
c[0][0] = 8
print(c)
На выходе уже [[8, 0, 0, 0], [8, 0, 0, 0], [8, 0, 0, 0], [8, 0, 0, 0]]
В обоих случаях список c вроде одинаковый. Не пойму в чем отличия.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.06.2023, 21:08
Цитата Сообщение от Alexey2007 Посмотреть сообщение
В таком виде на выходе [[8, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
потомучто и b и a проигнорированы и непонятно зачем созданы

Цитата Сообщение от Alexey2007 Посмотреть сообщение
c = a # здесь всё также
а здесь твой первый код из начала темы - ссылку на один и тот же список положил несколько раз
0
0 / 0 / 0
Регистрация: 29.06.2023
Сообщений: 11
29.06.2023, 21:27  [ТС]
Хорошо, лишнее уберу. А то может не понятно, что спрашиваю.
Python
1
2
3
4
5
6
7
8
9
10
11
b = [0 for i in range(2)]
a = [b for k in range(2)]
 
c = a
d = [[0, 0], [0, 0]]
 
print(c == d)  # True
 
c[0][0] = 1
d[0][0] = 1
print(c == d)  # False
Почему True превращается в False после одного и того же действия?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
29.06.2023, 22:08
Цитата Сообщение от Alexey2007 Посмотреть сообщение
после одного и того же действия?
еще раз, в первом случае дважды ссылаемся на один и тот же список, пока он пустой конечно списки c и d равны, но когда мы вставили единичку в первый то что произошло? правильно изменились оба его элемента, как и в примерах выше, а у списка Д изменился только один элемент. Ты почему в финале то не вывел на экран оба списка?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> b = [0 for i in range(2)]
>>> a = [b for k in range(2)]
>>> c = a
>>> d = [[0, 0], [0, 0]]
>>> print(c == d)  # True
True
>>>  
>>> c[0][0] = 1
>>> d[0][0] = 1
>>> print(c == d)  # False
False
>>> c
[[1, 0], [1, 0]]
>>> d
[[1, 0], [0, 0]] # Разве не видно даже просто глазами что список Д не похож на С???
Добавлено через 37 секунд
Цитата Сообщение от Alexey2007 Посмотреть сообщение
А то может не понятно, что спрашиваю.
все понятно, просто ты невнимательно ответы читаешь
0
0 / 0 / 0
Регистрация: 29.06.2023
Сообщений: 11
29.06.2023, 22:11  [ТС]
Welemir1, благодарю, разобрался.
Пару недель только как начал изучать программирование, не всё понимаю с полуслова.
Почитал еще кое-что по вашей наводке, тогда понял.
Т.е. я пытаясь заменить c[0][0] по факту меняю не 0, а список b...
Кстати ИИ тоже помог (до чего техника дошла). Тот же вопрос написал, и он ответил:
"Это происходит потому, что список c содержит ссылку на список a, а переменная a содержит ссылку на список b. Когда мы изменяем элемент в списке c или d, мы на самом деле изменяем один и тот же объект в памяти. Поэтому, в результате, с и d не равны после изменения элемента."
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
30.06.2023, 06:47
Цитата Сообщение от Alexey2007 Посмотреть сообщение
почему в коде приведенном ниже, число 8 присваивается сразу нескольким элементам?
- многомерные списки нужно создавать правильно. Например, так:

Python
1
2
3
4
arr=[[0 for _ in range(5)] for _ in range(5)]
print(arr)
arr[0][0]=888
print(arr)
или так:

Python
1
2
3
4
5
6
7
from copy import copy
 
b=[0 for _ in range(5)]
arr=[copy(b) for _ in range(5)]
print(arr)
arr[0][0]=777
print(arr)
А копирование многомерного списка нужно выполнять с помощью deepcopy.
0
0 / 0 / 0
Регистрация: 29.06.2023
Сообщений: 11
30.06.2023, 07:27  [ТС]
Catstail, благодарю!
Как раз сегодня к вложенным генераторам списков перехожу в обучении.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
30.06.2023, 14:42
Цитата Сообщение от Alexey2007 Посмотреть сообщение
к вложенным генераторам
- дело не в "генераторах", а в понимании сути понятия "ссылочная переменная". Кстати, слово "генератор" в этом контексте совершенно излишне. Правильный термин "list comprehensions". На русский этот термин следует переводить как "построитель списка". А генератор в Питоне (и вообще в программировании), это совсем другое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2023, 14:42
Помогаю со студенческими работами здесь

Не добавляется элемент в список для значения словаря
выводится только почему то последний элемент списка. Что сделать чтобы все выводил? При чем не в выводе проблема а в функции. def...

В список не добавляется другой список, что делать?
Метод просто берёт строку слов и разбрасывает слова по массивам меняя их местами так, что бы каждое слово исходной строки в конечном...

Не могу разобраться, почему элемент должен добавляться в начало списка, а добавляется как второй элемент
uses SysUtils,windows; type List=^Ukasatel; Ukasatel = record el:integer; next:List end; Var L,p:List;...

Не добавляется элемент
Добрый вечер коллеги! Привожу отрывок кода, в чём ошибка? for (let i = 0; i < response.items.length; i++) { ...

Объект добавляется в список, хотя не должен
Почему одинаковый объект записывается в лист, хотя по условию он не должен? private void OnTriggerEnter(Collider other) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru