Найти - Пользователи
Полная версия: Функция - передача параметров
Начало » Python для новичков » Функция - передача параметров
1
lEXA
Привет всем,
Передаю в функцию список, функция обрабатывает его и изменяет (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 элетентов
sergeek
можно воспользоваться чем-то вроде
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]
но ты там явно что-то не так делаешь. Может даже эти твои дубли можно избежать на этапе формирования списка
lEXA
sergeek
но ты там явно что-то не так делаешь. Может даже эти твои дубли можно избежать на этапе формирования списка
Вопрос не в дублях (я парсю веб страницу и удаляю одинаковые ссылки, дубли удаляются железно (проверял глазками)) - а в том что почему то список в функции один - 9 или 10 элементов.
После возвращение в основную программу 19
Курю на предмет видимости переменных но … второй день pythonа пока не могу найти решения своим граблям
sergeek
ну то что присвоишь какое-либо значение аргументу, через который ты передал свой список - исходного списка не изменит. Списки передаются указателем а не ссылками
lEXA
Так - у меня функция должна менять два списка
То есть у меня есть два варианта:
- объявлять оба списка глобальными и их потом менять через их значение. Это минус для меня - надо помнить что данная функция менять только те переменные.
- либо придумать тип из двух списоков и их возвращать через return?

PS Ну или разбивать функцию на две функии и возвращать каждый список через return
sergeek
да, только тип придумывать не надо - для этого есть кортеж
lEXA
Через кортеж вернуть две списка (я это и подразумевал выше но я только в начале python way)? Вариант. Легкий костыль конечно но..
Спасибо!
Завтра подумаю либо на две функции либо да кортежем
lEXA
И все равно не догоняю почему 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
doza_and
lEXA
И все равно не догоняю почему 19 тогда возвращается:

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

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