尝试在Python(3.6.3)中创建一个加密代码的简单消息时,遇到了一个问题,可以在下面的代码(单独的测试文件)中看到:
import sys
def test(integ):
integ += 1
return
def main():
x = 0
y = 2
test(x)
test(y)
print("{}\n{}".format(x, y))
test(x)
print(x)
if __name__ == "__main__":
main()
现在,我的目标是让它按顺序给我1,3和2作为输出,但它给我0,2和0,意味着变量x
和y
根本没有修改过。因此,在查找了我的问题的可能解决方案后,我找到了语句nonlocal
,并尝试以下列方式更改我的代码:
def test(integ):
nonlocal integ
integ += 1
return
但是,这次我得到以下错误:SyntaxError: name 'integ' is parameter and nonlocal
,这导致我得出的结论是我无法使用函数{中的参数}来更改变量x
和y
{1}}。
在避免使用全局变量的同时,是否会出现某种解决方法?
答案 0 :(得分:1)
test
只会收到您传入的值,而不是对该变量的引用。一个简单的解决方案是重新分配返回值:
>>> def test(integ):
... return integ + 1
...
>>> x = 0
>>> x = test(x)
>>> x
1
如果你想以这种方式返回多个值,那么Pythonic方式是通过一个元组(Python将为你打包/解包,如图所示):
>>> def test(integ):
... return integ + 1, integ - 1 # same as `return (integ + 1, integ - 1)`
...
>>> test(0)
(1, -1)
>>> x = 0
>>> x, z = test(x) # same as `(x, z) = test(x)`
>>> x
1
>>> z
-1
另一种选择是将值包装在可变的内容中(如字典):
>>> def test(integ):
... integ['value'] += 1
... return
...
>>> x = {'value': 0}
>>> test(x)
>>> x['value']
1
答案 1 :(得分:1)
相同的解决方法技术(参见Brett答案)改为使用列表:
>>> def f1(a_mutable_var):
... a_mutable_var[0] += 1
...
>>> L1 = [1]
>>> f1(L1)
>>> L1
[2]
>>>