Найти - Пользователи
Полная версия: Сортировка эл-в
Начало » Центр помощи » Сортировка эл-в
1
ahpex
Доброго время суток! Вопрос в следующем:
Требуется упорядочить 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)
sergeek
в функции передаются копии, а не указатели
>>> 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]
ahpex
Спасибо , но что то я туплю, то есть мне нужно в OrdTriple передать *args? Как это применить к моему коду, тк нужно реализовать, использовав данные функции, без посторонних средств?
sergeek
если именно те, то
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
upd
собственно *args не обязательно, просто список передается по ссылке и если изменять его будучи переданным в функцию, то измениться и исходный список.
sp3
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)
ahpex
Всем спасибо, вопрос закрыт.
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