2013-11-06 2 views
0

Привет, мои коллеги-программисты.«Может только итерировать» Ошибка Python

Я довольно новый программист, и теперь я столкнулся с большим затруднительным положением. Я получаю сообщение об ошибке:

can only assign an iterable 

Во-первых, я не знаю, что это значит.

Во-вторых, я оставлю свой код для вас профессионалов критиковать его:

def num_top(int_lis): 
    duplic_int_lis = int_lis 
    int_firs= duplic_int_lis [0] 
    int_lis[:] = duplic_int_lis [int_firs] 

В основном я пытаюсь найти [0] элемент в списке, а затем с помощью этого ИНТ в качестве индексной позиции, чтобы найти целое число в это положение индекса.

+0

Вы пытаетесь присвоить целое число (я думаю, от имени) к списку. Как говорится в ошибке: вы можете назначать только списки (или их фрагменты) итерабельными, а целое число не является итерируемым. – Hyperboreus

+0

'duplic_int_lis = int_lis' не создает дублирующий список. –

+0

@RogerPate .. то как можно создать дубликат списка? – user2954367

ответ

1

RHS присвоения среза должен быть итерируемым, а не скаляром. Рассмотрим slice-delete, а затем добавьте вместо этого.

+2

пока технически безупречный, я боюсь, что я не могу выдвинуть ответ, который на 98%, вероятно, перевернет голову опроса ... – Claudiu

+0

нет, что на самом деле имеет смысл, Единственное, что ... не могли бы вы объяснить удаление ломтика? – user2954367

+0

@ user2954367: 'del int_lis [:]' Это удаляет содержимое списка, но оставляет этот список сам по себе. Но, читая дальше, кажется, что вы совсем не хотите этого делать. –

3

int_lis[:] = duplic_int_lis [int_firs] означает, что все предметы duplic_int_lis [int_firs] - int_lis, поэтому он ожидает, что вы пройдете итеративный/итератор на RHS.

Но в вашем случае, вы передаете его нераскрытый итерацию, что неверно:

>>> lis = range(10) 
>>> lis[:] = range(5) 
>>> lis    #all items of `lis` replaced with range(5) 
[0, 1, 2, 3, 4] 

>>> lis[:] = 5  #Non-iterable will raise an error. 
Traceback (most recent call last): 
    File "<ipython-input-77-0704f8a4410d>", line 1, in <module> 
    lis[:] = 5 
TypeError: can only assign an iterable 

>>> lis[:] = 'foobar' #works for any iterable/iterator 
>>> lis 
['f', 'o', 'o', 'b', 'a', 'r'] 

Как вы не можете перебрать целое, следовательно, ошибка.

>>> for x in 1: pass 
Traceback (most recent call last): 
    File "<ipython-input-84-416802313c58>", line 1, in <module> 
    for x in 1:pass 
TypeError: 'int' object is not iterable 
+0

ОК, я получил код, работающий ... но теперь проблема в том, что ... ничего не мутирует ... он по-прежнему возвращает исходный список. – user2954367

+0

@ user2954367 На ваш вопрос непонятно, пожалуйста, приведите несколько примеров в теме вопроса. –

+0

в порядке, пожалуйста, дайте мне секунду – user2954367

0

итератора вещь с несколькими элементами, которые можно перебирать (например: принимать по 1 значение чего-то, то второе сделать что-то, и т.д. ...) списки, словари, кортежи, строки имеют несколько элементов в них и могут использоваться как итеративные. В качестве контрпримера: типы номеров не могут считаться итерабельными.

Помните, что компьютеры отсчитываются от 0 # так: если вы хотите, чтобы первое значение списка вы можете использовать

my_list[0] 

, прежде чем идти дальше, я хотел бы предложить смотреть это видео о зацикливание. https://www.youtube.com/watch?v=EnSu9hHGq5o

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