Форум сайта python.su
Доброго время суток! Вопрос в следующем:
Требуется упорядочить 3 эл-та по возрастанию. Проблема в том, что после выполнения всех сравнений и перестановок (OrdPair) числа возвращаются в начальной последовательности т.е. Swap срабатывает, но в итоге ничего не меняется. Что я делаю не так? Заранее спасибо!
def Swap(a, b): temp = a a = b b = temp def OrdPair(a, b): if a > b: Swap(a, b) def OrdTriple(a, b, c): OrdPair(a, b) OrdPair(b, c) OrdPair(a, b) return (a, b, c)
Отредактировано ahpex (Янв. 19, 2013 15:40:31)
Офлайн
в функции передаются копии, а не указатели
>>> a = 1 >>> def f(arg): ... print('before',arg) ... arg += 1 ... print('after',arg) ... >>> f(a) before 1 after 2 >>> a 1
>>> def OrdAny(*args): ... return sorted(args) ... >>> OrdAny(4,1,3) [1, 3, 4]
Офлайн
Спасибо , но что то я туплю, то есть мне нужно в OrdTriple передать *args? Как это применить к моему коду, тк нужно реализовать, использовав данные функции, без посторонних средств?
Отредактировано ahpex (Янв. 19, 2013 18:26:37)
Офлайн
если именно те, то
def Swap(ls,i1,i2): ls[i1],ls[i2] = ls[i2],ls[i1] def OrdPair(ls,i1,i2): if ls[i1] > ls[i2]: Swap(ls,i1,i2) def OrdTriple(a,b,c): ls = [a,b,c] OrdPair(ls,0,1) OrdPair(ls,0,2) OrdPair(ls,1,2) return ls
Отредактировано sergeek (Янв. 19, 2013 20:00:27)
Офлайн
ahpex
Внутри функций эти переменные локальны, их изменение ни как не повлияет на переменные с таким же именем в других местах программы (исключение из правила списки и словари). Это можно обойти явно присваивая значения:
def OrdPair(a, b): if a > b: return b,a else: return a,b def OrdTriple(a, b, c): a, b = OrdPair(a, b) b, c = OrdPair(b, c) a, b = OrdPair(a, b) return (a, b, c) print OrdTriple(3,2,1)
Офлайн
Всем спасибо, вопрос закрыт.
Офлайн