Numpy __isub__ изменение глобальной переменной - PullRequest
0 голосов
/ 08 апреля 2020

Я боролся с некоторыми операциями над NumPy массивами и функциями в недавнем скрипте. Я наконец обнаружил, что, кажется, ошибка: NumPy __isub__.

Вот пример:

def test(apocalypse):
    apocalypse = apocalypse - 3
    return apocalypse

def test2(apocalypse):
    apocalypse -= 3
    return apocalypse

foo = np.array([1,2,3])
print(test(foo))
print(foo)

bar = np.array([1,2,3])
print(test2(bar))
print(bar)

Что приводит к:

[-2 -1  0]
[1 2 3]
[-2 -1  0]
[-2 -1  0]

Ожидалось ли это? Должен ли -= изменить глобальную переменную (то же самое для +=)? Я попытался использовать int и float вместо NumPy массивов, и это сработало так, как я ожидал.

1 Ответ

0 голосов
/ 20 апреля 2020

Отправка ответа на тот случай, если кому-то понадобится больше информации, чем hpaulj и Willem Van Onsem быстрых и хороших ответов.

Полагаю, мы уже понимаем, как изменяемые / неизменяемые объекты работают. Если нет, то здесь у нас есть ответ об этом в по ссылке против присвоения context.

Проблема, с которой я столкнулся, была связана с тем, что isub является оператором на месте, и он использовался с изменяемым объектом, поэтому исходная переменная, переданная присваиванием функции test, изменила свой объект, не имея ничего общего с глобальными переменными, как я предполагал.

Обратите внимание, что, как мы могли видеть, не потому, что у вас есть изменяемый объект, все операции будут изменять объект на месте. Пример с id:

arr = np.array([1,2,3])
print(id(arr))    # prints 139838225358560
arr += 3 
print(arr)        # prints [4 5 6]
print(id(arr))    # prints 139838225358560
arr = arr + 3
print(arr)        # prints [7 8 9]
print(id(arr))    # prints 139838016018832

Оператор на месте += выполняет изменение объекта arr, в то время как присвоение = создает новый. То же самое касается моего вопроса с apocalypse -= 3 и apocalypse = apocalypse - 3 соответственно.

Python документация содержит краткое и хорошее объяснение операторов на месте со списком их.

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