2016-01-09 5 views
-1

Я пытался работать со списком списков и хочу взять один из элементов в списке списка, работать с ним, а затем добавить его в другой список.Python2.7 добавление в список списка

я узнал, что .append() было поведение, которое я не ожидал:

def li_of_li_test (li): 
    l = li[0] 
    l.append(0) 
    return li 

Функция должна возвращать только li, но вместо этого ...

print li_of_li_test ([[1,2,3],[4,5]]) 

Возвращает:

[[1, 2, 3, 0], [4, 5]] 

Что я могу сделать, чтобы вернуть его

[[1,2,3],[4,5]] 
+1

Не добавлять '0' в списке? Я не понимаю, в чем проблема. – IanAuld

+0

Вы намеренно «добавляете» '' 'в первый под-' 'с' l = li [0]; l.append (0) ', тогда вы удивляетесь, когда получаете там новый' 0'? Почему вы ожидаете, что значение останется неизменным? – ShadowRanger

ответ

0

В значении python передается по ссылке. И список - это переменная структура.

from copy import deepcopy 

def li_of_li_test (li): 
    l = deepcopy(li[0]) 
    l.append(0) 
    return li 

print li_of_li_test ([[1,2,3],[4,5]]) 

[[1, 2, 3], [4, 5]] 
+0

Ну, проблема здесь была бы непониманием того, что 'l = li [0]' does, а не прохождение аргумента; в конце концов, печатаемое значение - это значение, возвращаемое функцией, и даже с семантикой pass-by-value, которая не изменится. – ShadowRanger

0

Я предполагаю, что в реальном коде, это:

def li_of_li_test (li): 
    l = li[0] 
    l.append(0) 
    return li 

будет пытаться оставить li аргумент неизмененной, но сделать первый суб- list в li, и поставить модифицированную копию в какой-либо другой list. Вы думали, что l = li[0] сделает новую копию этого суб-list для работы, но это не то, что она делает; он просто делает l другой ссылкой на тот же list, хранящийся в li[0]. Если вы хотите скопировать list, простая мелкая копия может быть достигнута:

l = li[0][:] # [:] is a complete slice of the sublist, a shallow copy 

или вы можете с большей работой глубоко скопировать компоненты из list, а не только list структуры с:

import copy 

l = copy.deepcopy(li[0]) 

В любом случае, простой append s и тому подобное l не повлияет на li.

Если вам нужно сделать много мутаций для разных подсписок, deepcopy ing li в целом может иметь смысл; вы сделали бы это раньше, и не нужно беспокоиться о деструктивном мутации li после этого.

0

Ниже можно решить вашу проблему:

def li_of_li_test (li): 
    l = li[:] 
    l = list(li[0]) 
    l.append(0) 
    return li 
Смежные вопросы