Я новичок в Python (но не программирование в целом) и не очень понимаю, что происходит со списками. У меня есть тысячи наборов тестов в текстовом файле, и каждый набор тестов 256 (может быть разным) x, y баллов. Я хочу сохранить каждую точку в тестовом наборе в виде списка, а затем сохранить каждый список в другом списке, эффективно создавая 2D-список. Два из трех опций, которые я пробовал, не содержат ошибок, но я не знаю, что означают разные опции и почему я должен выбирать один над другим. Это не то же самое, что «Наименьшее изумление» и изменяемый аргумент по умолчанию Потому что это не объясняет, какой из них является списком, и каковы другие определения.

foo= list
foo.append(1)#TypeError: descriptor 'append' requires a 'list' object but received a 'int'

bar= []
bar.append(1)#no error

baz= list()
baz.append(1)#no error
0
FeMaiden 2 Май 2019 в 20:17

3 ответа

Лучший ответ

Первый устанавливает foo на объект list. Как вы обнаружили, это не пустой список. Объект list является встроенным типом ... и теперь у вас есть псевдоним в области действия для типа. Вы не можете добавить к типу; отсюда и сообщение об ошибке.

Два других - это классические способы инициализации переменной в пустой список. Средняя использует списочную литеральную нотацию для построения списка, а последняя вызывает объект типа list как функцию для генерации экземпляра типа.

4
user2357112 supports Monica 2 Май 2019 в 17:26

Когда вы делаете foo = list, вы фактически присваиваете foo встроенному объекту списка python. bar = list() и baz = [] оба инициируют две новые переменные как новый список вакансий. Однако в python var_ = [] присваивание происходит немного быстрее по сравнению с var_ = list().

2
Arkistarvh Kltzuonstev 2 Май 2019 в 17:22

Это потому, что foo = list делает foo псевдонимом для типа list. Фактический list объект не был создан в этой строке. Однако если у вас есть list объект, вы можете использовать list.append() (или foo.append()) для добавления к нему.

Вот так:

foo = list
bar = [1]

list.append(bar, 2)
# bar is now [1, 2]

foo.append(bar, 3)
# bar is now [1, 2, 3]

Поскольку ваш пример кода вызывает foo.append() только с одним аргументом (int), исключение жалуется, что ему нужен list, а не int.

Примечание. Это не особенность класса списка. Все методы экземпляра могут быть вызваны в обеих формах: some_object.func(a, b, c) или SomeType.func(some_object, a, b, c)

0
Kyle Willmon 2 Май 2019 в 18:18