2015-07-16 4 views
1

Можно ли передать фрагмент списка в функцию и изменить список через срез?Изменение фрагмента списка, переданного в функцию

Это не похоже на работу:

def foo(a_list): 
    a_list[0]='abc' 

x=[1,2,3,4] 
foo(x[0:2]) 

Я хочу, чтобы х теперь будет х = [ 'ABC', 2,3,4]

+1

'x [0,2]' приведет к ошибке. Вы имеете в виду 'x [0: 2]'? – BrenBarn

+0

Я серьезно сомневаюсь в этом, учитывая, что нарезка дает вам новый список. Если вам нужно обновить вещи, сделайте 'x [0: 2] = foo (x [0: 2])' – NightShadeQueen

ответ

1

Нет. «Список фрагментов» в том смысле, в котором вы описываете, - это не что иное, как новый список. Когда вы делаете x[0:2], результирующий список не «знает», что он был создан как фрагмент другого списка. Это просто новый список.

Что вы можете сделать, это пройти в самом срезе объекте, отдельно от списка:

def foo(a_list, a_slice): 
    a_list[a_slice]='abc' 

>>> foo(x, slice(0, 2)) 
>>> x 
['a', 'b', 'c', 3, 4] 
1

Нет! Срезы создают копии списков (см. the documentation). Вы можете сделать это:

>>> x = [1, 2, 3, 4] 
>>> x[1:3] = [7, 8, 9] 
>>> X 
[1, 7, 8, 9, 4] 

Но, когда вы получаете новый список из операции нарезания, это копия, и, следовательно, изменения в него не будут влиять на оригинал:

>>> x = [1, 2, 3, 4] 
>>> y = x[1:3] 
>>> y[0] = 5 
>>> y 
[5, 3] 
>>> x 
[1, 2, 3, 4] 
1
def foo(a_list): 
    a_list[0]='abc' 
    return a_list 

x=[1,2,3,4] 
foo(x) #it returns x=['abc',2,3,4] 
1

Предположительно вы пытаетесь передать в x[0:2], а не x[0,2], но причина, по которой он не работает, заключается в том, что при создании среза вы создаете копию подмассива x.

Вы не работаете в одном экземпляре этого массива, то, что вы делаете, это передача совершенно нового массива. Прохождение только в 'x' будет работать, но передача в x[0:2] не будет, если вы специально не написали его как x[0:2] = foo(x[0:2]) и имели foo() return a_list.

1

Как пояснило brenns10, ломтики создать копию (даже в Python 3.0) ваши данных оригинальных.

Вы могли бы сделать что-то вроде следующего:

def foo(x): 
    x[0] = 'abc' 
    return x 

x = [0, 1, 2, 3] 
x[0:2] = foo(x[0:2]) # x = ['abc', 1, 2, 3] 

В то время как это дает желаемый результат, он точно не работает, как вы хотите. Это может быть проблематично, если вам нужно выполнять большие фрагменты, так как вам придется выполнять много копий.

Смежные вопросы