2014-05-20 5 views
-3

Как это можно объяснить?Назначение списка Python

s = [1,2,3,4,5,6,7,8,9] 
s[0] = s[0:0]     #replace s[0] by empty list s[0:0] 
s 
[[], 2, 3, 4, 5, 6, 7, 8, 9]  # s after assignment 
len(s) 
9 

s[3] = s[0:0]     # samething for s[3] 
[[], 2, 3, [], 5, 6, 7, 8, 9] # s after s[3] has been replaced by s[0:0] 
len(s) 
9 

s[5:7] = s[0:0]     # replace a slice by empty list 
s 
[[], 2, 3, [], 5, 8, 9]   # slice has been removed 
len(s) 
7 

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

Ну, это не так! Как это объясняется?

+0

«Я могу ожидать, что каждый элемент среза должен быть заменен пустым списком» - назначение среза не работает по-разному. – user2357112

ответ

2

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

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

2

Неверно, что длина списка всегда сохраняется. Верно то, что срез слева заменяется на все, что находится справа.

lst = [0, 1, 2, 3, 4, 5, 6, 7] 

print(lst[0]) # prints one value 
print(lst[3]) # prints one value 
print(len(lst[1:3])) # prints 2, length of sublist 
print(len(lst[:])) # prints 4, length of whole list 

lst[:] = [] # replace entire list with empty list 

Кстати, очень странно использовать кусочек [0:0], чтобы получить список нулевой длины. Легче понять, просто ли код [], литерал, представляющий список нулевой длины.

+0

Правда! Это скорее теоретический вопрос, чем практический. – flamenco

2
s[3] = s[0:0] # replacing single element 
s[5:7] = s[0:0] # replacing two elements and setting to [] removes the elements. 
using s[5] = s[0:0],s[6] = s[0:0] is different from s[5:7] 

Если изменить s[5:7] = s[0:0] к s[5:7] = s[0:2], вы получите различное поведение, как будет изменено.

Если вы используете s[5:7] = s[0:1], элемент с индексом 5 будет изменен, и элемент с индексом 6 будет удален.

+0

Привет, Padraic! Конечно, он заменяет 2 элемента. Но почему эти два элемента не являются пустым списком? – flamenco

+0

вы в основном превращаете два элемента в один. –

+0

ОК, и где этот элемент? – flamenco

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