Python 即使条件评估为 False,列表也会更新

Python list updaitng even when condition evaluates to False

为什么 longest_palindrome 变量在 isPalindrome() 函数求值为 False 时更新? if/else 条件与我预期的不同。

def palindromeCutting(s):
    if s == "":
        return ""

    letters = list(s)

    while len(letters) > 0:
        tmp = []
        longest_palindrome = []
    
        for i in range(len(letters)):
            tmp.append(letters[i])

            if isPalindrome(tmp):
                print("updating longest with tmp")
                longest_palindrome = tmp
            print("longest_palindrome:",longest_palindrome)

        if len(longest_palindrome) > 1:
            l = len(longest_palindrome)
            letters = letters[l:]
        else:
            return "".join(letters)

def isPalindrome(arr):
    left, right = 0, len(arr) - 1

    while left <= right:
        if arr[left] != arr[right]:
            return False
        left += 1
        right -= 1

    return True

当 运行 with s = "aaacodedoc" 时的输出是:

longest_palindrome: ['a']
longest_palindrome: ['a', 'a']
longest_palindrome: ['a', 'a', 'a']
longest_palindrome: ['a', 'a', 'a', 'c']
longest_palindrome: ['a', 'a', 'a', 'c', 'o']
longest_palindrome: ['a', 'a', 'a', 'c', 'o', 'd']
longest_palindrome: ['a', 'a', 'a', 'c', 'o', 'd', 'e']
longest_palindrome: ['a', 'a', 'a', 'c', 'o', 'd', 'e', 'd']
longest_palindrome: ['a', 'a', 'a', 'c', 'o', 'd', 'e', 'd', 'o']
longest_palindrome: ['a', 'a', 'a', 'c', 'o', 'd', 'e', 'd', 'o', 'c']

您正在使用 longest_palindrome 引用 tmp。 所以他们都指向同一个对象。

第 3 次迭代后 tmp 对象仍在增长,因此 longest_palindrome 也在增长。

longest_palindrome = tmp

您可以通过复制/创建具有相同内容的新对象来尝试:

longest_palindrome = tmp[:]

问题是您将 longest_palindrom 设置为 tmp。从那时起,tmplongest_palindrom 指向同一个对象。每当修改 tmp 时,修改都会反映在 longest_palindrom 上,反之亦然。

为避免这种情况,您可以将 longest_palindrom 设置为 tmpcopy,替换行

longest_palindrom = tmp

来自

longest_palindrom = tmp[:]

将 longest_palindrom 设置为包含 tmp.

元素的 new 列表

如果您想更深入地解释列表别名,this question 的答案解释得很好。