Почему функция допускает мутацию глобальной переменной, не возвращая ее? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть вопрос о области видимости переменной в Python.Почему мутация переменной допускается без возврата мутированной переменной?

def mutation(L):
    L.append("x")

L = []
mutation(L)
print(L)

Я ожидаю, что это напечатает [], поскольку мутация L внутри функции влияет только на локальную область видимости.Почему «L» мутирует даже в глобальном масштабе?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

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

Отправка копии в функцию:

def mutation(L):
    L.append("x")

L = []
mutation(list(L))
print(L)
# Prints out []

Создание копии внутри функции:

def mutation(L):
    L = list(L)
    L.append("x")

L = []
mutation(L)
print(L)
# Prints out []
0 голосов
/ 21 октября 2018

Это потому, что вы фактически изменяете исходный список / объект, переданный в функцию.Обратите внимание, что основным принципом является передача по ссылке на объект .Поэтому изменения переданного параметра внутри функции будут отражаться снаружи.

Если вы не хотите изменять глобально, используйте [:] для создания копии, и это будет выполнять операции с копией без изменения исходного списка..

def mutation(L):
    L = L[:]
    L.append("x")

L = []
mutation(L)
print(L)
# []
...