2016-04-27 2 views
3

Этот код:Почему этот действительный Python?

bounding_box = (
    -122.43687629699707, 37.743774801147126 
    -122.3822021484375, 37.8
) 

производит следующее значение:

(-122.43687629699707, -84.63842734729037, 37.8) 

Есть три значения, потому что я забыл Запятая в первой строке. Удивительно, но Python принимает это и добавляет второе и третье числа вместе!

Это что-то вроде string literal concatenation, но для чисел? Почему это всегда было бы желательным поведением?

ответ

9

Что происходит просто. В следующем назначении

bounding_box = (
    -122.43687629699707, 37.743774801147126 
    -122.3822021484375, 37.8
) 

эквивалентно

bounding_box = (-122.43687629699707, **37.743774801147126-122.3822021484375**, 37.8) 

Таким образом, эти два значения просто вычитается, и, следовательно, производить 3-кортеж.

3

Без перевода строки, а сбросив знаков после запятой для ясности:

bounding_box = (-122, 37 - 122, 37) 

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

+0

Да! Это хорошая причина для запуска linter. Например, PyCharm показывает эту жалобу на третий номер: «PEP8: отсутствует пробел вокруг оператора». Хотя он не достигает основной причины (недостающая запятая), это, по крайней мере, подсказка, что что-то не так. – danvk

0

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

Что делать, если вы пытаетесь сохранить текст в окне? Разделителем между значениями является запятая, а не новая строка. Вот почему это желаемое поведение.