使用Python中

时间:2017-11-03 22:19:29

标签: python python-3.x

尝试在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,意味着变量xy根本没有修改过。因此,在查找了我的问题的可能解决方案后,我找到了语句nonlocal,并尝试以下列方式更改我的代码:

def test(integ):
    nonlocal integ
    integ += 1
    return

但是,这次我得到以下错误:SyntaxError: name 'integ' is parameter and nonlocal,这导致我得出的结论是我无法使用函数{中的参数}来更改变量xy {1}}。

在避免使用全局变量的同时,是否会出现某种解决方法?

2 个答案:

答案 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]
>>>