В Python 2 input()
будет отображаться строка, и в этом случае она создаст кортеж, и поскольку кортежи будут неизменными, вы получите эту ошибку.
>>> eval('1, 2, 3')
(1, 2, 3)
более безопасно использовать raw_input
с list-comprehension
здесь:
inp = raw_input("Please input a series of numbers, divided by a comma:")
actual_list = [int(x) for x in inp.split(',')]
Или, если вас не беспокоит вход пользователя, просто преобразуйте кортеж в список, передав его в list()
.
Также обратите внимание, что при попытке обновить список внутри функции внутри нет смысла возвращать список, если вы не хотите назначать другую переменную в тот же список объект. Либо верните новый список или ничего не вернете.
Помимо всех аспектов input()
, рассмотренных в других ответах, я хотел бы добавить этот совершенно другой аспект:
Ваша функция add_25()
, вероятно, не предполагается change его вход.
Но на самом деле вам не нужно менять входные данные (и вы не должны этого делать, потому что это не хороший стиль из-за его уродливой стороны -последствия). Вместо этого вы можете просто вернуть новый кортеж:
def add_25(mytuple):
return tuple(x + 25 for x in mytuple)
Таким образом, ничто не назначается кортежу, только новый кортеж создается и возвращается.
ast.literal_eval
является безопасной версией eval
, нужно действительно использовать: ast.literal_eval(raw_input(...))
и почти никогда input(...)
.
– Dan D.
8 December 2014 в 00:30
ast.literal_eval("1, 2, 3")
приводит к (1, 2, 3)
, как это делает eval
, на самом деле это замена в этом случае.
– Dan D.
8 December 2014 в 10:20
def test_tuples_of_one_look_peculiar(self):
self.assertEqual( __,(1).__class__)
self.assertEqual(__, (1,).__class__)