Странная ошибка с типом диапазона в назначении списка - PullRequest
5 голосов
/ 01 февраля 2012
r = range(10) 

for j in range(maxj):
    # get ith number from r...       
    i = randint(1,m)
    n = r[i]
    # remove it from r...
    r[i:i+1] = []

При трассировке я получаю странную ошибку:

r[i:i+1] = []
TypeError: 'range' object does not support item assignment

Не уверен, почему выдает это исключение, они что-то изменили в Python 3.2?

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

Хорошее предположение: они что-то изменили. Range раньше возвращал список, и теперь он возвращает итеративный объект range, очень похожий на старый xrange.

>>> range(10)
range(0, 10)

Вы можете получить отдельный элемент, но не назначить его, потому что это не список:

>>> range(10)[5]
5
>>> r = range(10)
>>> r[:3] = []
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    r[:3] = []
TypeError: 'range' object does not support item assignment

Вы можете просто вызвать список объекта диапазона, чтобы получить то, к чему вы привыкли:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> r = list(range(10))
>>> r[:3] = [2,3,4]
>>> r
[2, 3, 4, 3, 4, 5, 6, 7, 8, 9]
2 голосов
/ 01 февраля 2012

Попробуйте это исправить (я не эксперт по python 3.0 - просто размышляю на этом этапе)

r = [i for i in range(maxj)]
...