Уведомления

Группа в Telegram: @pythonsu

#1 Май 2, 2013 15:04:30

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

Привет всем,
Передаю в функцию список, функция обрабатывает его и изменяет (returnом не возвращаю - списков несколько…)

print 'До входа в список', len(List2List)
print 'До вызова функции', len(List2List)
func(text, List2List)
print 'После вызова функции', len(List2List)

Сама функция
print 'До удаление дублей',len(List2List)
List2List = list(set(List2List))
print 'После удаление дублей', len(List2List)

Имеем:
До входа в список 1
До удаление дублей 19
После удаление дублей 9
После вызова функции 19

То есть функция убирает дубли в конце и должна вернуть список из 9 элементов
А возвращает 19

Меняю функцию - последней строчкой добавляю элемент (итого 10)
Все равно в основной функции 19 элетентов

Отредактировано lEXA (Май 2, 2013 15:06:00)

Офлайн

#2 Май 2, 2013 15:44:31

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

Функция - передача параметров

можно воспользоваться чем-то вроде

def del_dub(ls):
    to_delete = [i for i,e in enumerate(ls) if e in ls[i+1:]]
    for bad_idx in reversed(to_delete):
        del ls[bad_idx]
        
l = [1,1,1,2,2,3,3,4,4,2]
del_dub(l)
l
Out[4]: [1, 3, 4, 2]
но ты там явно что-то не так делаешь. Может даже эти твои дубли можно избежать на этапе формирования списка

Офлайн

#3 Май 2, 2013 15:55:35

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

sergeek
но ты там явно что-то не так делаешь. Может даже эти твои дубли можно избежать на этапе формирования списка
Вопрос не в дублях (я парсю веб страницу и удаляю одинаковые ссылки, дубли удаляются железно (проверял глазками)) - а в том что почему то список в функции один - 9 или 10 элементов.
После возвращение в основную программу 19
Курю на предмет видимости переменных но … второй день pythonа пока не могу найти решения своим граблям

Офлайн

#4 Май 2, 2013 16:25:52

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

Функция - передача параметров

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

Офлайн

#5 Май 2, 2013 18:01:59

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

Так - у меня функция должна менять два списка
То есть у меня есть два варианта:
- объявлять оба списка глобальными и их потом менять через их значение. Это минус для меня - надо помнить что данная функция менять только те переменные.
- либо придумать тип из двух списоков и их возвращать через return?

PS Ну или разбивать функцию на две функии и возвращать каждый список через return

Офлайн

#6 Май 2, 2013 18:19:02

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

Функция - передача параметров

да, только тип придумывать не надо - для этого есть кортеж

Офлайн

#7 Май 2, 2013 18:23:10

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

Через кортеж вернуть две списка (я это и подразумевал выше но я только в начале python way)? Вариант. Легкий костыль конечно но..
Спасибо!
Завтра подумаю либо на две функции либо да кортежем

Офлайн

#8 Май 2, 2013 21:21:51

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

И все равно не догоняю почему 19 тогда возвращается:
Программа

List2List=[]
List2List.append(url)
response = urllib2.urlopen(url)
text = response.read()
print 'До вызова функции', len(List2List)
ff(text, List2Url, List2List)
print 'После вызова функции', len(List2List)
Сама функция:
def ff(text, List2Url, List2List):
# много чего делаем
    # Уберем дубли из списков
    List2List.sort(key=str.lower)
    print 'До удаление дублей',len(List2List)
    List2List = list(set(List2List))
    print 'После удаление дублей', len(List2List)
    List2List.append('2222')
    print 'Добавили', len(List2List)

Все! То есть добавили 10 элемент и функция закончилась.
В логе:
До вызова функции 1
До удаление дублей 19
После удаление дублей 9
Добавили 10
После вызова функции 19
Если параметры как ссылки но после возвращение должен быть 1 элемент.
Или 10.
А почему 19 фиг знает (это до удаление дублей). Попробовал в конце функции удалять элементы списка через pop. Все равно 19

Офлайн

#9 Май 2, 2013 22:11:13

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Функция - передача параметров

lEXA
И все равно не догоняю почему 19 тогда возвращается:

List2List = list(set(List2List))
В этом месте вы создали новый список и прилепили его к имени List2List. Это легко проверяется по id объекта.
List2List[:] = list(set(List2List))
А это уже перезапись содержимого



Офлайн

#10 Май 2, 2013 22:15:20

lEXA
От: Екатеринбург
Зарегистрирован: 2013-04-30
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция - передача параметров

doza_and
А это уже перезапись содержимого
Бинго! Огромное спасибо! Завтра буду знать с какого момента продолжить читать книгу:-)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version