Найти - Пользователи
Полная версия: Работа со списками
Начало » Python для новичков » Работа со списками
1
ibn_maksimys
Добрый день!

Пишу на С++, но сейчас появилась необходимость решить задачу на 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

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

Причина понятна! А как теперь обойти проблемку и добиться желаемого результата?
odnochlen
fl[:]
создает плоскую копию списка. Если нужна глубокая (если список содержит изменяемые обьекты, списки, например) - то copy.deepcopy.
nickmetal
Вопрос тоже немного по теме

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

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

код работает только тогда, когда нули идут не один за одним, а когда их несколько один только удаляется. Можете, пожалуйста, подсказать, в чем проблема?
GaiveR
...
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)
sergeek
там индексы смещаются при удалении
попробуй
a = [1,2,0,0,65]
b = [e for e in a if e]
b
Out[3]: [1, 2, 65]
nickmetal
спасибо за ответы. я только не совсем понимаю конструкцию фрагмента
b = [e for e in a if e]
где можно почитать про это?
o7412369815963
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]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB