Найти - Пользователи
Полная версия: Странная поведение конактинации списков
Начало » Python для новичков » Странная поведение конактинации списков
1
Atronah
Насколько я понимаю, если 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> меняет данные, на которые ссылается левый операнд (а не пытается заменить новой ссылкой на новые данные)
doza_and
def test(a, b):
a = a + a - создается локальная a и ей присваивается конкатенация a a
b += b - модифицируется переданный b

возможен вариант:
b*=2
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