Понимание Python для цикла, с объектом, используемым в качестве индекса? - PullRequest
0 голосов
/ 30 августа 2018

Вот тестовый код, который я написал.

class myclass:
    def __init__(self, aty):
        self.number = 0;
        self.anitype = aty;

l = [];
l.append(myclass("tiger"))
l.append(myclass("lion"))
l.append(myclass("puma"))
l.append(myclass("jagur"))

# Method 1 : of course this doesn't work, but I saw a case where it works
#for idx in l: l[idx].number = idx

# Method 2 : of course this works
for idx, lst in enumerate(l):
   l[idx].number = idx

for idx, lst in enumerate(l):
    print("%d : %s" % (lst.number, lst.anitype))

Результат:

0 : tiger
1 : lion
2 : puma
3 : jagur

Конечно, метод 1 не должен работать, но сегодня я увидел какой-то код, полученный от другой компании, и у него есть строка ниже (только показанные фрагменты)

for idx in ls: ls[idx].Oi = idx

Здесь ls - список объектов класса. Класс имеет переменную-член экземпляра Oi. Считая эту строку странной, я запустил код с помощью отладчика, и он работает! Значения Oi объектов-членов списка присваиваются 0,1,2,3, ..

Как это работает? Кстати, эта строка кода видна в функции, которая не является функцией-членом класса (это глобальная функция).

1 Ответ

0 голосов
/ 30 августа 2018

В Python есть тип отображения dict. При переборе словаря вы перебираете его ключи. Чтобы получить значения, вам все равно нужно использовать ключи в качестве индексов:

d = {'a': 3, 'b': 5, 'c': 4}
for key in d:
    print(key, d[key])

Вывод (порядок может отличаться):

a 3
b 5
c 4

Весьма вероятно, что код, который вы видите, делает это (перебирает dict или другой объект отображения вместо list). Если вы видите что-то инициализированное как

d = {}  # An empty dict

Тогда это dict объект. (Пустые множества инициализируются как set())

...