Python修改函数中的全局变量 出身背景

Python修改函数中的全局变量 出身背景,python,global-variables,exec,Python,Global Variables,Exec,假设我有两个全局变量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) 输出: [b',a'][3,2,1] 但是,如果a和b是我的函数的参数,我们该怎么做 a = [1,2,3] b = ['a','b'] def

假设我有两个全局变量
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)
输出:

[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
输出:

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


您仍然必须将值作为参数传递。进入函数后,需要对每个列表进行在位切片指定。不需要涉及全局名称

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]

func2(a,b)需要2个参数,但您不提供any@ErnestBidouille对于这一点,我修正了你不能有一个变量作为参数和全局你必须选择。最好不要使用全局变量,只需删除它。我曾经将函数体内的
a
b
视为局部变量,这意味着
a
函数体内只包含全局
a
的值。然而,你的方法绝对正确<全局
a
==
id(a)
内部函数的code>id。我认为,如果不使用
global a
语句,我们就可以修改全局变量
a
,这是非常危险的。所以在实践中,最好不要像这样更改全局变量?
a
b
都是局部变量,但这并不意味着它们不能引用全局变量也引用的值,这意味着如果不小心,可以使用局部变量来改变全局状态。(如果您还没有,可能需要阅读)换句话说,名称有作用域,但值没有。@chepner不起作用,但感谢您的回复。但是,你发布的链接不起作用,要不要更新一下?我是根据你的密码战回答来的。我的问题是:当函数是
a,b=b[:-1],a[:-1]
时,为什么
[:]
会工作,全局值根本不会更改?谢谢。对不起,链接应该是;包括句子结束时。
a=…
是一个普通的赋值;它使名称
a
引用一个新值,而不管它以前引用什么<代码>一个[:]=…根本不是一个“真正的”任务;它由一个方法调用
a.\uuuuu setitem\uuuuuu(slice(None,None,None),…)
实现。