Корректирует проклятие моей жизни [дубликат]

1
задан Ashwini Chaudhary 8 December 2014 в 00:13
поделиться

4 ответа

В 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().


Также обратите внимание, что при попытке обновить список внутри функции внутри нет смысла возвращать список, если вы не хотите назначать другую переменную в тот же список объект. Либо верните новый список или ничего не вернете.

3
ответ дан Community 15 August 2018 в 21:13
поделиться

Помимо всех аспектов input(), рассмотренных в других ответах, я хотел бы добавить этот совершенно другой аспект:

Ваша функция add_25(), вероятно, не предполагается change его вход.

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

def add_25(mytuple):
    return tuple(x + 25 for x in mytuple)

Таким образом, ничто не назначается кортежу, только новый кортеж создается и возвращается.

0
ответ дан Alfe 15 August 2018 в 21:13
поделиться
  • 1
    Обратите внимание, что поскольку ast.literal_eval является безопасной версией eval, нужно действительно использовать: ast.literal_eval(raw_input(...)) и почти никогда input(...). – Dan D. 8 December 2014 в 00:30
  • 2
    Да, но в этом случае программист должен анализировать список или значения, разделенные запятыми, а не литерал. Но спасибо за указатель на эту функцию; еще не знал этого. – Alfe 8 December 2014 в 10:11
  • 3
    Поскольку ast.literal_eval("1, 2, 3") приводит к (1, 2, 3), как это делает eval, на самом деле это замена в этом случае. – Dan D. 8 December 2014 в 10:20
  • 4
    О, я вижу. В этом смысле кортеж считается литералом. Это действительно хорошо, спасибо. – Alfe 8 December 2014 в 10:25
def test_tuples_of_one_look_peculiar(self):
    self.assertEqual( __,(1).__class__)
    self.assertEqual(__, (1,).__class__)
-1
ответ дан Andrew Elliott 15 August 2018 в 21:13
поделиться
0
ответ дан Alfe 5 September 2018 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: