Найти - Пользователи
Полная версия: Область видимости
Начало » Python для новичков » Область видимости
1
asdf
Сразу скажу что мой вопрос элементарный, и я пробовал нагуглить ответ, но ничего толком не нашел.
Например, есть функция которая должна вернуть аргумент увеличенный на 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] #Вот что я хочу получить
py.user.next
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
asdf
Почему же у меня не работает? Принципиальной разницы не вижу.
Rodegast
> Почему же у меня не работает? Принципиальной разницы не вижу.

Потому что вы в цикле создаёте локальную переменную item, а не изменяйте глобальную l.
asdf
Rodegast
Я знаю что передается по значению. Просто код в первом и втором посте похож, но во втором случае работает, а в первом нет.
Значение списка меняется на заданное при выходе из for.
FishHook
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
asdf
FishHook
Как только заканчивается for у меня функция возвращает глобальное значение. Что конкретно в моем примере не так?
Я меняю значение присваиванием, а во втором посте значение изменяется присваиванием по индексу элемента. Это просто два разных способа, которые должны дать одинаковый результат.
mr-x
Введите свой код сюда:
http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit

И убедитесь, что в цикле массив не изменяется, изменяется только переменная item.
asdf
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]
Как мне вернуть значение так, что бы получить ?
fata1ex
Два очевидных решения:

>>> 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]
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