Скопируйте переменную в python (jupyter) / Используйте разные функции с одинаковыми переменными - PullRequest
0 голосов
/ 06 сентября 2018

Я написал небольшую Программу на python, но она не работает так, как ожидалось.

Вот код:

puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
        p[0] += 1
        return p
def main(p):
    print(p)
    l = count(p)
    print(l)
    print(p)

b1 = main(puzzle)

Я ожидаю, что print (p) будет отличаться от print (l), но результат обоих одинаков, это результат, который должен иметь print (l). Но p тоже изменилось, однако мне нужно, чтобы оно не изменилось ... Это особое поведение Python? Я что-то пропустил? Я также пытался изменить имена переменных в функциях, но это не помогло. Я перезапустил компилятор, но это тоже не помогло.

Есть ли решение для сохранения выходных данных функции и повторного вызова функции, не позволяя функции изменять заданные параметры? Так что l будет результатом после вычисления, а p останется значением до?

С уважением, Джох.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Причина этого в том, что Python передает параметры функции по ссылке. Когда вы вызываете функцию count, она позволяет функции изменять список внутри функции, и изменения будут применены к исходному объекту.

Если вы хотите, чтобы функция не изменяла список, а вместо этого возвращала другой список, вам нужно будет сделать копию списка, передав копию в функцию или сделав копию внутри самой функции. Есть много способов скопировать список в Python, но мне нравится использовать для этого функцию list().

Это должно решить вашу проблему:

puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
    new_list = list(p)  # copy values of p to new_list
    new_list[0] += 1
    return new_list

def main(p):
    print(p)
    l = count(p)
    print(l)  # l is the new_list returned from count
    print(p)  # p stays the original value

b1 = main(puzzle)
0 голосов
/ 06 сентября 2018

Вы передаете параметр List. Передача параметров - Call-by-Object. Поскольку List является изменяемым объектом в этой ситуации, он аналогичен передаче по ссылке, и изменения в вашем объекте List будут сохраняться. Если бы вы передавали неизменяемый объект, такой как Integer или String, это было бы похоже на передачу по значению copy / value, и изменения не сохранялись бы. E.g.:

def s2asdf(s):
    s = "asdf"

s = "hello world"
s2asdf(s)
print s

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

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