Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2012 19:26:01

Atronah
От:
Зарегистрирован: 2012-01-13
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Странная поведение конактинации списков

Насколько я понимаю, если LST - список, то следующие операции идентичны:
LST = LST + LST
LST += LST

и в принципе, код ниже это подтверждает:

myList = ['a','b','c']
myList = myList + myList
print myList

myList = ['a','b','c']
myList += myList
print myList
Вывод будет такой:
['a', 'b', 'c', 'a', 'b', 'c']
['a', 'b', 'c', 'a', 'b', 'c']
Но следующий код доказывает обратное:
def test(a, b):
a = a + a
b += b
#end test

myList1 = ['a','b','c']
myList2 = ['a','b','c']
test(myList1, myList2)
print myList1
print myList2
Вывод будет таким:
['a', 'b', 'c']
['a', 'b', 'c', 'a', 'b', 'c']
Причем, если выводить внутри функции значение a и b, то выводятся правильные, удвоенные списки


P.S.: почти сразу после дописывания мною этого поста мой друг нашел решение.
Операция <oprnd> + <oprnd> создает новый объект и возвращает ссылку на него, а так как в функции возможно менять только данные, переданные по ссылке, но не саму ссылку, то в результате внутри функции список удваивается, а после выхода из функции списку возвращается ссылка на прежний объект..
Операция <oprnd> += <oprnd> меняет данные, на которые ссылается левый операнд (а не пытается заменить новой ссылкой на новые данные)



Отредактировано (Янв. 13, 2012 19:32:29)

Офлайн

#2 Янв. 13, 2012 19:32:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Странная поведение конактинации списков

def test(a, b):
a = a + a - создается локальная a и ей присваивается конкатенация a a
b += b - модифицируется переданный b

возможен вариант:
b*=2



Отредактировано (Янв. 13, 2012 19:34:52)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version