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

Список меняет свои значения загадочным образом

30.09.2019, 11:50. Показов 1380. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.
listing = [[None]*add]*total
 
num=1
 
for i in range(total):
    
    data=bin(num)
    data=str(data)
    data=data[2:]
    _data=add-len(data)
    for y in range(_data):
        data='0'+data 
 
    for j in range(add):
    
        listing[i][j]=data[j]
 
 
        print(listing[i][j],end=' ')
    
    num+=1
    print()
Суть в том, что программа создает в консоли что-то вроде таблицы, куда заносит переведённое в бинарную систему десятичное num. И всё работает, таблица строится, но почему-то если я после этого элемента кода снова начну обращаться к списку, то КАЖДЫЙ его конечно вложенный элемент будет равняться единице ( даже те элементы, которые во время работы цикла принимали значение 0 и выводили его). Почему? Я ничего не переприсваивал.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2019, 11:50
Ответы с готовыми решениями:

Словарь не меняет свои значения
for key, value in birthdays_2.items(): value = list k=k+1 print(birthdays_2) пытаюсь заменить изначальные...

Массив меняет свои значения
Проблема вот такая. В процессе этой программы массив summ меняет свои значения, хотя я к нему вообще не прикасался. int main() { ...

iframe не меняет свои размеры
Всем привет ! Есть проблема, почему то ифрейм не меняет свои размеры. Помогите плиз ! Где ошибка ? <SCRIPT...

9
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
30.09.2019, 11:59
Mayche, пример то чего не привел? скопировал твой код, вывело таблицу, потом вывожу listing -там все как в таблице.
Цитата Сообщение от Mayche Посмотреть сообщение
то КАЖДЫЙ его вложенный элемент будет равняться единице ( даже те элементы, которые во время работы цикла принимали значение 0 и выводили его). Почему? Я ничего не переприсваивал.
покажи что именно ты делаешь, чтобы все стало единицами
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
30.09.2019, 12:10
Потому что результат [None]*add хранится в "вышестоящем" списке по ссылке. То есть там на каждой позиции один и тот же список, а не такой же.
Используйте copy. Или просто [:].

Добавлено через 38 секунд
Или ещё есть numpy, тоже хороший вариант для подобного.
1
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 9
30.09.2019, 12:20  [ТС]
В том-то и дело, что я ничего не делаю, а он становится единицами.

Могу привести полный код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import math
 
 
print('Введите двоичный код')
code = input()
info=len(code)
 
add=1
while 2**add<info+add+1: #решение неравенства
    add+=1
 
total=info+add #получение конечного количества разрядов
 
print()
print('В коде '+str(info)+' информативных бита. Будет добавлено '+str(add)+' дополнителных битов. Код Хэмминга будет содержать ' + str(total) +' битов.')
print()
listing = [[None]*add]*total
_listing = listing
print(' ',end=' ') #отрисовка номеров вспомогательных битов ( для глаза)
for i in range(add): #1
    print('Y'+str(add-i), end=' ') #1
 
print()
 
num=1
 
for i in range(total):
    
    data=bin(num)
    data=str(data)
    data=data[2:]
    _data=add-len(data)
    for y in range(_data):
        data='0'+data 
 
    for j in range(add):
    
        listing[i][j]=data[j]
 
 
        print(listing[i][j],end=' ')
    
    num+=1
    print()
Добавлено через 1 минуту
Спасибо за ответ, но я в нём пока ничего не понял. Почему всё заполняется именно единицами,? Потому что в конце всех циклов в последнюю очередь обрабатывается единица? Можете избавить мою слабую голову от этого ада и показать на примере как использовать copy?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
30.09.2019, 12:27
Цитата Сообщение от Mayche Посмотреть сообщение
В том-то и дело, что я ничего не делаю, а он становится единицами.
конкретно покажи строку или скрин приведи, где видно что все становится единицами, я твой код запускаю, в самом конце вывожу листинг - там есть и 0 и 1
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
30.09.2019, 12:33

Не по теме:


В том-то и дело, что я ничего не делаю, а он становится единицами.
- Господи, за что??? Я ж ничего не делал!
- Вот как раз за это.




Mayche, чесгря, не знаю, почему именно единицами и лень разбираться. Просто я знаю эту типовую ошибку начинающих, да и сам когда-то наступил на эти грабли.
По поводу "показать на примере" - гугление по "python copy" выдаёт тыщи их, даже на русском. Однако советую перед этим ещё раз прочитать мой предыдущий ответ и задуматься над разницей между "один и тот же" и "такой же".

Добавлено через 5 минут
Для совсем непонятливых:
Python
1
2
3
4
5
6
7
8
9
10
lst = [[None]*3]*4
lst
Out[5]: 
[[None, None, None],
 [None, None, None],
 [None, None, None],
 [None, None, None]]
lst[0][1] = 18
lst
Out[7]: [[None, 18, None], [None, 18, None], [None, 18, None], [None, 18, None]]
1
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 9
30.09.2019, 12:36  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
или скрин приведи
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
num=1
 
for i in range(total):
    
    data=bin(num)
    data=str(data)
    data=data[2:]
    _data=add-len(data)
    for y in range(_data):
        data='0'+data 
 
    for j in range(add):
    
        listing[i][j]=data[j]
 
 
        print(listing[i][j],end=' ')
    
    num+=1
    print()
 
print("Сейчас повторно обойду массив")
for i in range(total):
    for j in range(add):
        print(listing[i][j],end=' ')
 
    print()
Миниатюры
Список меняет свои значения загадочным образом  
0
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 9
30.09.2019, 12:37  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Для совсем непонятливых:
Cпасибо. Я понял, чем отличается такой же от того же самого. Просто я не понимаю как это пофиксить через copy. Ну сейчас читаю информацию, надеюсь, разберусь.


извиняюсь за флуд, не знал, что это будет новым сообщением
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
30.09.2019, 12:51
Лучший ответ Сообщение было отмечено Mayche как решение

Решение

Mayche, ага, понял, как тебе и писали выше проблема из-за того что это ссылка на один и тот же список, а в самом последнем проходе ты его заполняешь единицами. Если в начале ввести "101" когда просят двоичный код, то в итоге ноли у тебя сохранятся, потому я и не мог сначала повторить.

поправить можно так
Python
1
listing = [[None]*add for e in range(total)]
а вот это зачем?
Цитата Сообщение от Mayche Посмотреть сообщение
_listing = listing
Добавлено через 13 секунд
Mayche, ага, понял, как тебе и писали выше проблема из-за того что это ссылка на один и тот же список, а в самом последнем проходе ты его заполняешь единицами. Если в начале ввести "101" когда просят двоичный код, то в итоге ноли у тебя сохранятся, потому я и не мог сначала повторить.

поправить можно так
Python
1
listing = [[None]*add for e in range(total)]
а вот это зачем?
Цитата Сообщение от Mayche Посмотреть сообщение
_listing = listing
0
0 / 0 / 0
Регистрация: 23.11.2017
Сообщений: 9
30.09.2019, 12:55  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
поправить можно так
До слёз. Вот это язык. Но всё работает, спасибище!

Цитата Сообщение от Welemir1 Посмотреть сообщение
а вот это зачем?
а это я с бубном пытался станцевать, чтобы понять в чем дело. это для себя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2019, 12:55
Помогаю со студенческими работами здесь

tableLayoutPanel самопроизвольно меняет свои размеры
Добрый день! Может быть, кто-то сталкивался с такой проблемой. На форме есть вкладки, на вкладке tableLayoutPanel, на которой еще...

Форма сама меняет размеры компонентов и свои собственные. Что делать?
Здравствуйте. Перешёл с Delphi 7 на RAD Studio 10 Сиэтл. Я делаю программу на двух разных компах с разными разрешениями и масштабами шрифта...

После запуска агента или браузера монитор темнеет, рабочий стол меняет свои цвета.
привет люди у меня проблемка...когда я включаю агент или оперу(мазилу)то монитор темнеет и возвращаясь в прежнее состояние рабочий стол...

При Landscape картинка на прелоадаре растягивается на весь экран и через это меняет свои пропорции
Есть такой код xml. Он каким-то образом запускается как прелоадер в одним приложении на смартфон. Картинка splashscreen(1).png имеет высоту...

Каким образом getchar() меняет содержимое массива?
Здравствуйте! Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru