【问题标题】:Why parameter values being stored in my function after a call?为什么调用后参数值会存储在我的函数中?
【发布时间】:2020-12-22 03:31:15
【问题描述】:

我在 Python 中看到了一些我以前从未见过的东西。

我正在编写动态编程教程,以查找两个字符串之间的最长公共子序列。为了澄清我不想帮助解决这个问题。我的问题是参数 accs 是存储之前函数调用的返回值。

代码如下:

def lcs(str1 = '', str2 = '', accs = []):
    if str1 and str2:
        str1 = list(str1)
        str2 = list(str2)
        for char1 in str1:
            for char2 in str2:
                if char1 == char2:
                    accs.append(char1)
                    str1.remove(char1)
                    str2.remove(char2)
                    return lcs(''.join(str1), ''.join(str2), accs=accs)
        str1.remove(char1)
        return lcs(''.join(str1), ''.join(str2), accs)
                
    else:
        return accs

print(lcs('AGGTAB','GXTXAYB'))
print(lcs('ABCDGH','AEDFHR'))

打印语句返回

['A', 'G', 'T', 'B']
['A', 'G', 'T', 'B', 'A', 'D', 'H']

第一个打印语句是正确的,但第二个包含第一个的子字符串。

当我在上面代码下方的单元格中运行函数 lcs(无括号)而不调用它时,我得到以下信息:

<function __main__.lcs(str1='', str2='', accs=['A', 'G', 'T', 'B', 'A', 'D', 'H', 'A', 'D', 'H'])>

我尝试在 Jupyter-lab 的单元格中运行代码,然后在 VSCode 和命令行中将其作为脚本运行,并且值似乎在两者的参数中累积。这里发生了什么?

在 WSL2 下的 Ubuntu 中运行 Python 3.8.5,在 Windows 上运行 Python 3.9.1。两个地方的问题都很相似。

【问题讨论】:

标签: python-3.x


【解决方案1】:

您应该在下一次函数调用之前为变量 acs 分配一个空列表。当您不清除该 accs 值时,第二个函数调用将第一个函数调用的 accs 值作为参数。

print(lcs('AGGTAB','GXTXAYB'))
print(lcs('ABCDGH','AEDFHR', []))

【讨论】:

    【解决方案2】:

    @xjoshbrownx - 这是众所周知的常见问题之一,您也可以找到相关信息。这里 - https://docs.python-guide.org/writing/gotchas/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 2016-09-19
      • 2010-12-10
      • 2022-01-20
      • 1970-01-01
      • 2019-06-13
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多