Python пересмотреть глобальные переменные внутри функции - PullRequest
0 голосов
/ 03 февраля 2020

Фон

Предположим, у меня есть 2 глобальные переменные a = [1,2,3] и b = ['a','b']. Если я должен обменять a и b внутри функции, я могу сделать следующий код:

a = [1,2,3]
b = ['a','b']
def fun1():
    global a,b
    temp = a[::-1]
    a = b[::-1]
    b = temp
fun1()
print(a,b)

Out:

['b', 'a'] [3, 2, 1]

Однако, если a и b являются параметрами моей функции, как нам это сделать?

a = [1,2,3]
b = ['a','b']
def fun2(a,b):
    global a,b
    temp = a[::-1]
    a = b[::-1]
    b = temp
fun2(a,b)
print(a,b)

Ошибка повышения:

SyntaxError: имя 'a' является параметром и глобальным

Моя попытка

Я пытался сделать с exec, он работает на Python 3.7, Однако он не работает на Codewars 3.6 env. Я не знаю причина, может быть, я просто нахожу неправильный метод.

a = [1,2,3]
b = ['a','b']
def exchange_with(a, b):
    temp = a[::-1].copy()
    exec('a = b[::-1]',globals())
    exec('b = temp',locals(),globals())
exchange_with(a, b)
a,b

Out:

(['b', 'a'], [3, 2, 1])

1 Ответ

1 голос
/ 03 февраля 2020

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

def fun2(a,b):
    a[:], b[:] = b[::-1], a[::-1]

x = [1,2,3]
y = ['a', 'b']
fun2(x, y)
assert x == ['b', 'a']
assert y == [3, 2, 1]
...