Почему не работает копия списка в функции? - PullRequest
0 голосов
/ 04 апреля 2019
b = [0]

def copyalist(b):
    b = [1, 2, 3]
    print(b)

copyalist(b)
print(b)

Выходы ниже:

[1, 2, 3]
[0]

Первая строка указывает, что в функции b было установлено значение [1, 2, 3]; Однако, когда вы печатаете (b) вне функции, второй вывод говорит, что b по-прежнему [0].

Я не понимаю, почему внешний b не изменился?

Я также пробовал b = copy.deepcopy ([1, 2, 3]), выходные данные такие же.

Тем не менее, следующий код работает хорошо:

b = [0]

def copyalist(b):
    b += [1, 2, 3]
    print(b)

copyalist(b)
print(b)

Выводы приведены ниже:

[0, 1, 2, 3]
[0, 1, 2, 3]

Ответы [ 4 ]

0 голосов
/ 04 апреля 2019

Это связано с разницей в глобальных и локальных переменных. Вы можете добавить global к своей функции, чтобы получить желаемый результат.

b = [0]

def copyalist():
    global b
    b = [1, 2, 3]
    print(b)

copyalist()
print(b)

OUTPUT

[1, 2, 3]
[1, 2, 3]

Более подробное описание - здесь

0 голосов
/ 04 апреля 2019
b = copyalist(b) 

и вернуть b в функцию

def copyalist(b):
    b = [1, 2, 3]
    return(b)

Когда вы определяете что-то в функции, оно используется только внутри этой функции.

0 голосов
/ 04 апреля 2019

Этот код:

def copyalist(b):
    b = [1, 2, 3]
    print(b)

будет означать только переназначение имени переменной b в новый список, но без изменения исходного b. Если вы хотите изменить исходный список, вы должны явно указать Python заменить фактический контент. Способ сделать это:

def copyalist(b):
    b[:] = [1, 2, 3]
    print(b)
0 голосов
/ 04 апреля 2019

В python списки передаются в качестве аргументов функции только по ссылке, т. Е. Дается только адрес памяти первого элемента.При определении нового b внутри функции вы просто меняете позицию в памяти, к которой относится внутренняя переменная b, но внешняя b по-прежнему указывает на исходную позицию.И наоборот, когда вы делаете b += [1, 2, 3], вы изменяете содержимое внутри ячейки, на которое ссылается внутренняя b, и, поскольку внутренняя и внешняя b указывают на одни и те же ячейки, это отражается в изменении внешней bа также.

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