【发布时间】:2022-01-15 04:07:21
【问题描述】:
我试图解决 Pyhon 3.x 中的动态编程问题。我想创建一个备忘录字典对象。在将None 的默认值分配给memo 参数后,None 与not object 的检查似乎不起作用,但如果我将其更改为object is None,它工作正常。
不起作用,我的意思是在not object 的情况下,此条件不会评估为True,并且不会执行以下缩进代码。
这会导致 LeetCode 上的 TLE。但是使用is None check 确实有效,它为备忘录分配了一个字典,因此缓存按预期工作,并且解决方案通过了。
为什么会这样?
def lcs(i, j, memo = None):
if not memo:
memo = {}
对
def lcs(i, j, memo = None):
if memo is None:
memo = {}
我用return lcs(0, 0)调用了这个函数。
编辑:在我的系统 Python IDLE 上,两个表达式的计算结果都为 True。所以我认为,LeetCode 平台对代码的处理方式不同。
编辑 2:在@buran 指出之后的某个时候,这些部分 sn-ps 也在 LeetCode 上产生了预期的结果,我也尝试了部分 sn-ps,它们确实给出了预期的结果。但是当我尝试整个代码(从过去的提交中使用)时,令人惊讶的是它也给出了预期的结果(实际上创建了新的备忘录)。直到今天,我才能真正重现我早些时候遇到的问题。 对于不同的问题,代码再次显示相同的行为,现在我想我在这里遗漏了一些东西。这就是我这次发布整个代码的原因。有人可以发现并解释为什么这两个代码给出不同的结果。
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
def lps(l, r, memo = None):
if memo is None:
memo = {}
if (l, r) not in memo:
if l > r:
memo[(l, r)] = 0
elif l == r:
memo[(l, r)] = 1
elif s[l] == s[r]:
memo[(l, r)] = lps(l+1, r-1, memo) + 2
else:
memo[(l, r)] = max(lps(l+1, r, memo), lps(l, r-1, memo))
return memo[(l, r)]
return lps(0, len(s)-1)
对
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
def lps(l, r, memo = None):
if not memo:
memo = {}
if (l, r) not in memo:
if l > r:
memo[(l, r)] = 0
elif l == r:
memo[(l, r)] = 1
elif s[l] == s[r]:
memo[(l, r)] = lps(l+1, r-1, memo) + 2
else:
memo[(l, r)] = max(lps(l+1, r, memo), lps(l, r-1, memo))
return memo[(l, r)]
return lps(0, len(s)-1)
还有人可以告诉我是否应该从我过去的编辑或原始帖子中删除以及应该删除什么。这正在成为一个非常长的帖子。 (我是新来的)
【问题讨论】:
-
你能澄清什么“不起作用”吗?是否抛出错误?结果不是你预期的吗?如果可能,请提供代码以便他人可以复制和粘贴来说明问题。
-
这不是你要问的,而是
def lcs(i, j, memo = {}): -
@danh - 默认值可能很棘手。在您的示例中,当缺少参数时,始终使用一个默认的 dict 对象。每个调用都会得到相同的字典,它将保存来自其他调用的任何数据。
-
@danh 使用可变默认参数被认为是一种不好的做法,并且可能导致棘手的错误。见docs.python-guide.org/writing/gotchas/…,docs.quantifiedcode.com/python-anti-patterns/correctness/…。
-
请发帖minimal reproducible example。目前,当您调用
lcs(0, 0)时,两个 sn-psmemo将是空字典。鉴于lcs()不返回任何内容(因此返回 None)并且您将其称为 return 语句的一部分return lcs()可能还有其他事情发生 - 范围问题或 if/else 块或其他问题
标签: python-3.x function nonetype