Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2012 15:50:33

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Добрый день!

Пишу на С++, но сейчас появилась необходимость решить задачу на Python. Столкнулся со следующим странным поведение:

m = [[1], [2]]
m = m * 2;
id = 0;
fl = 1;
for i in range(0, 2):
    for j in range(0, 2):
        m[id].append(fl);
        id = id + 1;
    fl = fl + 1;

Предполагал, что на выходе будет нечто такое:
1 1
2 1
1 2
2 2

Но части исходного массива m изменяются одновременно, и на выходе совсем неожиданный для меня результат:
1, 1, 2
2, 1, 2
1, 1, 2
2, 1, 2

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



Офлайн

#2 Окт. 12, 2012 16:35:34

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Работа со списками

В питоне все типы передаются по ссылке, у тебя есть несколько ссылок на список fl, соответственно, если ты его изменяешь, то эти изменения появляются по всем ссылкам.

Офлайн

#3 Окт. 12, 2012 16:46:50

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

odnochlen
В питоне все типы передаются по ссылке, у тебя есть несколько ссылок на список fl, соответственно, если ты его изменяешь, то эти изменения появляются по всем ссылкам.

Причина понятна! А как теперь обойти проблемку и добиться желаемого результата?



Офлайн

#4 Окт. 12, 2012 17:20:51

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Работа со списками

fl[:]
создает плоскую копию списка. Если нужна глубокая (если список содержит изменяемые обьекты, списки, например) - то copy.deepcopy.

Офлайн

#5 Янв. 11, 2013 12:36:47

nickmetal
Зарегистрирован: 2012-11-15
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

Вопрос тоже немного по теме

задание: удалить элементы списка, равные нулю.
вот есть мой код:

a=[1,2,0,0,65]
i=0
for el in a:
    
    if a[i]==0:
        del a[i]
    i=i+1
    
print(a)  

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

Офлайн

#6 Янв. 11, 2013 12:54:49

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа со списками

...
if a[i] == 0:
del a[i]
else:
i = i + 1
Но я не уверен как поведет себя итератор, если в процессе прохода изменять список. Даже если всё и работает нормально, такой подход непрозрачен и может вызвать проблемы при использовании других ЯП.

Нормальное решение:
lst = [1, 2, 0, 0, 65]
lst = [elem for elem in lst if elem != 0]
print(lst)



Офлайн

#7 Янв. 11, 2013 12:55:45

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Работа со списками

там индексы смещаются при удалении
попробуй

a = [1,2,0,0,65]
b = [e for e in a if e]
b
Out[3]: [1, 2, 65]

Офлайн

#8 Янв. 11, 2013 12:59:23

nickmetal
Зарегистрирован: 2012-11-15
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками

спасибо за ответы. я только не совсем понимаю конструкцию фрагмента

b = [e for e in a if e]
где можно почитать про это?

Отредактировано nickmetal (Янв. 11, 2013 12:59:49)

Офлайн

#9 Янв. 11, 2013 13:06:34

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Офлайн

#10 Янв. 13, 2013 12:45:20

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Работа со списками

sergeek
там индексы смещаются при удалении
попробуй
a = [1,2,0,0,65]
b = [e for e in a if e]
b
Out[3]: [1, 2, 65]

Мне больше нравится “функциональный” подход:
a = [1,2,0,0,65]
b = filter(None, a)
# или b = filter(bool, a)
> [1, 2, 65]

Отредактировано o7412369815963 (Янв. 13, 2013 12:47:15)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version