почему я не могу получить результат в первой функции в приведенном ниже коде, но нет проблем с получением их во второй? - PullRequest
1 голос
/ 20 марта 2020

Функция 1

def scale(data, factor):
    for j in data:
        j = j * factor

target = [1,2,3,4,5]
factors = 4

scale(target, factors)
print(target)

Выход = [1, 2, 3, 4, 5]

Функция 2

def scale(data, factor):
    for j in range(len(data)):
        data[j] *= factor

target = [1,2,3,4,5]
factors = 4

scale(target, factors)
print(target)

Выход [4, 8, 12, 16, 20]

Почему это так в первой функции я не получаю вывод, но когда я использую функцию диапазона, я вдруг получаю?

1 Ответ

1 голос
/ 20 марта 2020

Разница в том, как вы получаете доступ к этим массивам. В первом случае

for j in data:
    j = j * factor

Вы получаете доступ к каждому j <int> в данных. Поскольку в Python переменные типа int являются неизменяемыми, делая j = j * factor, вы создаете новую переменную с именем j с новой памятью, на старый j по-прежнему ссылаются «данные», но старый Память j здесь не изменилась. Важно отметить, что data все еще ссылается на старый j, поэтому он не изменяется.

В отличие от этого, при выполнении

for j in range(len(data)):
    data[j] =  data[j] * factor # <- equivalent to *=

Вы получаете указатель на j-й элемент из data, умножьте его значение на factor и установите data[j] в качестве этого нового значения.

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