【问题标题】:How can python function actually change the parameter rather than the formal parameter?python函数如何实际更改参数而不是形参?
【发布时间】:2016-08-26 07:27:27
【问题描述】:

我正在尝试使用 python 基本库对“1024”进行编码。在此过程中,我尝试将列表 [0, 2, 4, 4] 变为 [0, 2, 8, 0]。所以这是我的测试代码。这很容易。

    def merger(a, b):
        if a == b:
        a += b
        b = 0


    numlist = [0, 2, 4, 4]
    merger(numlist[0], numlist[1])
    merger(numlist[1], numlist[2])
    merger(numlist[2], numlist[3])
    print (numlist)

所以当我尝试进行合并时。我期望输出 [0, 2, 8, 0]。但是它给了我 [0, 2, 4, 4] 。我想可能是因为我只是更改了函数 a b 的局部变量而不是实际参数?但是,如果我想让这种情况发生,我该怎么办?谢谢!

我想我一般想知道我是否想要一个函数不返回任何东西,而只是改变我作为参数传递的变量的值。我怎样才能实现它?

【问题讨论】:

  • 可以用global a, b引入全局变量。但是,这通常不被认为是一种好的做法……人们通常更喜欢使用 return 语句从函数中获取值。
  • @nostradamus:是的,避免修改全局变量很好,但global 对 OP 的代码没有帮助。
  • 哦,这很有趣。谢谢!
  • 在我看来,使用全局变量几乎可以做任何事情,这与优雅的编码完全相反...例如,您可以在这里引入 4 个全局变量:numlist = [g1, g2, g3, g4] 和一个本地变量名为 gsender 的变量。后者会将信息传送到def merger(gsender),这两个变量应该合并。一点都不优雅,但你可行。
  • 我认为这可能更像是出于安全原因。使用全局变量可能会导致代码不安全或不稳定?

标签: python function syntax


【解决方案1】:

您可以将列表和索引传递给函数:

def merger(l, a, b):
    if l[a] == l[b]:
        l[a] += l[b]
        l[b] = 0

numlist = [0, 2, 4, 4]
merger(numlist, 0, 1)
merger(numlist, 1, 2)
merger(numlist, 2, 3)
print(numlist)

由于列表对象是通过引用传递的,函数内部对列表的任何更改都会在函数调用后生效。

【讨论】:

  • 学到了很多!谢谢!
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2015-07-25
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多