Ссылки на глобальные примитивы против объектов
Может кто-нибудь объяснить, пожалуйста, следующий результат в Python?
При запуске следующего фрагмента кода Python выдает ошибку, говоря, что переменнаяx
ссылка была перед назначением:
x = 1
def increase_x():
x += 1
increase_x()
Решение, конечно, было бы включить строкуglobal x
после объявления функции дляincrease_x
.
Однако при выполнении следующего фрагмента кода ошибки не возникает, и в результате вы ожидаете:
x = [2, -1, 4]
def increase_x_elements():
for k in range(len(x)):
x[k] += 1
increase_x_elements()
Это потому, что целые числа являются примитивами в Python (а не объектами) и такx
в первом фрагменте примитив хранится в памяти, в то время какx
во втором фрагменте ссылки на указатель на объект списка?