Уведомления

Группа в Telegram: @pythonsu

#1 Март 20, 2012 23:20:03

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости

Сразу скажу что мой вопрос элементарный, и я пробовал нагуглить ответ, но ничего толком не нашел.
Например, есть функция которая должна вернуть аргумент увеличенный на 1, как присвоить результат работы функции переменной?
Мне нужно чтобы функция изменила значение переменной, и это можно было увидеть в основном модуле. Как правильно это сделать?

l = [1, 2, 3, 4, 5]

def plus_1(x):
for item in x:
item = item + 1
return x

plus_1(l)

print l

l = [1, 2, 3, 4, 5] #Вот что я получаю

l = [2, 3, 4, 5, 6] #Вот что я хочу получить



Офлайн

#2 Март 21, 2012 01:03:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Область видимости

def plus_1(x):
for i in xrange(len(x)):
x[i] += 1
return x


lst = [1, 2, 3, 4, 5]
plus_1(lst)
print lst
add
в первый раз написал с ошибкой
-    for i in range(len(x)):
+ for i in xrange(len(x)):

- lst[i] += 1
+ x[i] += 1



Отредактировано (Март 23, 2012 06:12:26)

Офлайн

#3 Март 22, 2012 19:00:00

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости

Почему же у меня не работает? Принципиальной разницы не вижу.



Офлайн

#4 Март 22, 2012 19:41:15

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Область видимости

> Почему же у меня не работает? Принципиальной разницы не вижу.

Потому что вы в цикле создаёте локальную переменную item, а не изменяйте глобальную l.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Март 22, 2012 20:50:50

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости

Rodegast
Я знаю что передается по значению. Просто код в первом и втором посте похож, но во втором случае работает, а в первом нет.
Значение списка меняется на заданное при выходе из for.



Отредактировано (Март 22, 2012 21:44:21)

Офлайн

#6 Март 23, 2012 02:09:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Область видимости

asdf
Rodegast
Я знаю что передается по значению. Просто код в первом и втором посте похож, но во втором случае работает, а в первом нет.
Значение списка меняется на заданное при выходе из for.
>>> x=1
>>> def plus(x):
return x+1

>>> plus(x)
2
>>> x
1
>>> def plus_1(x):
x+=1
return x

>>> plus_1(x)
2
>>> x
1
Ну а почему бы нам не сделать так, раз уж мы хотим изменить значение х

>>> x=plus(x)
>>> x
2



Офлайн

#7 Март 23, 2012 11:17:44

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости

FishHook
Как только заканчивается for у меня функция возвращает глобальное значение. Что конкретно в моем примере не так?
Я меняю значение присваиванием, а во втором посте значение изменяется присваиванием по индексу элемента. Это просто два разных способа, которые должны дать одинаковый результат.



Отредактировано (Март 23, 2012 11:19:06)

Офлайн

#8 Март 23, 2012 11:43:46

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

Область видимости

Введите свой код сюда:
http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit

И убедитесь, что в цикле массив не изменяется, изменяется только переменная item.



Офлайн

#9 Март 23, 2012 13:32:10

asdf
От:
Зарегистрирован: 2012-02-12
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости

mr-x

>>> l = [1,2,3,4,5]
>>> def plus1(x):
... for item in x:
... item = item +1
... print item
... return x
...
>>> plus1(l)
2
3
4
5
6
[1, 2, 3, 4, 5]
Как мне вернуть значение так, что бы получить ?



Офлайн

#10 Март 23, 2012 13:39:48

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Область видимости

Два очевидных решения:

>>> m = [1,2,3,4,5]
>>> def foo(m):
... return [i+1 for i in m]
>>> m = foo(m)
>>> m
[2, 3, 4, 5, 6]
>>> def bar(m):
... return map(lambda x:x+1, m)
>>> m
[2, 3, 4, 5, 6]
>>> m = bar(m)
>>> m
[3, 4, 5, 6, 7]



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version