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
。从那时起,tmp
和 longest_palindrom
指向同一个对象。每当修改 tmp
时,修改都会反映在 longest_palindrom
上,反之亦然。
为避免这种情况,您可以将 longest_palindrom
设置为 tmp
的 copy,替换行
longest_palindrom = tmp
来自
longest_palindrom = tmp[:]
将 longest_palindrom 设置为包含 tmp
.
元素的 new 列表
如果您想更深入地解释列表别名,this question 的答案解释得很好。
为什么 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
。从那时起,tmp
和 longest_palindrom
指向同一个对象。每当修改 tmp
时,修改都会反映在 longest_palindrom
上,反之亦然。
为避免这种情况,您可以将 longest_palindrom
设置为 tmp
的 copy,替换行
longest_palindrom = tmp
来自
longest_palindrom = tmp[:]
将 longest_palindrom 设置为包含 tmp
.
如果您想更深入地解释列表别名,this question 的答案解释得很好。