Подтвердить что ты не робот

Почему [:] = 1 принципиально отличается от [:] = '1'?

Пожалуйста, рассмотрите два фрагмента кода (обратите внимание на различие между строкой и целым числом):

a = []
a[:] = '1'

и

a = []
a[:] = 1

В первом случае a есть ['1']. Во втором я получаю ошибку TypeError: can only assign an iterable. Почему использование '1' over 1 здесь принципиально иное?

4b9b3361

Ответ 1

Присвоение срезу требует итерации с правой стороны.

'1' повторяется, а 1 - нет. Рассмотрим следующее:

In [7]: a=[]

In [8]: a[:]='abc'

Результат:

In [9]: a
Out[9]: ['a', 'b', 'c']

Как вы можете видеть, список получает каждый символ строки как отдельный элемент. Это является следствием того, что итерация по строке приводит к ее символам.

Если вы хотите заменить диапазон элементов a на один скаляр, просто оберните скаляр в некотором итерабельном виде:

In [11]: a[:]=(1,) # single-element tuple

In [12]: a
Out[12]: [1]

Это также относится к строкам (при условии, что строка должна рассматриваться как отдельный элемент, а не как последовательность символов):

In [17]: a[:]=('abc',)

In [18]: a
Out[18]: ['abc']

Ответ 2

'1' - это строка, но она итерабельна. Это похоже на список персонажей. a[:]='1' заменяет содержимое списка a содержимым строки '1'. Но 1 - целое число.

Python не изменяет тип.

Пример:

print bool(1=='1') # --> False