使用自制 "deepcopy" 撤消功能?
Undo function using self made "deepcopy"?
我想创建一个 undo()
函数来撤消 python 中的最后一个操作,所以我只是在对另一个列表进行任何修改之前对列表进行深度复制(我做了一个盗版deepcopy
自己),调用 undolist
,然后当我调用 undo()
时,我只是从 undolist
中弹出最后一个元素
我知道还有其他更有效的方法可以做到这一点,但考虑到我的时间限制和我的精神能力,我认为我无法将其提交。
然而,它不起作用。我要 post 一个例子,说明我如何在随机函数上实现撤消功能和盗版 deepcopy
,因为代码本身超长并且使用另一种语言
我希望我说得足够清楚,如果有任何误解,我会编辑post。
main_list = [list of lists that have elements in them]
def bootleg_deepcopy(main_list):
new_list = []
for x in main_list:
nx = x[:]
new_list.append(nx)
return new_list
def delete_elements(main_list,user_input,undolist):
#function that deletes elements from the list if a condition isn't met
undolist.append(bootleg_deepcopy(main_list))
main_list[:] = [element for element in main_list if not function_that_checks_something(whatever,something)]
return main_list
def undo(main_list,undolist):
try:
main_list = undolist.pop()
except Exception as ex:
print(ex)
return main_list
您的撤消操作只是 returns 对 main_list 的新引用。您的 delete_elements 方法会就地覆盖 main_list (main_list[:] = ...
)。我假设您希望在撤消操作中有相同的行为,以便所有包含对 main_list 的引用的地方都会自动更新。
解决方案是在 undo()
函数中使用切片运算符 (?)。我对其进行了编辑,使其包含正确的代码。
def undo(main_list,undolist):
try:
main_list[:] = undolist.pop()
except Exception as ex:
print(ex)
return main_list
我想创建一个 undo()
函数来撤消 python 中的最后一个操作,所以我只是在对另一个列表进行任何修改之前对列表进行深度复制(我做了一个盗版deepcopy
自己),调用 undolist
,然后当我调用 undo()
时,我只是从 undolist
我知道还有其他更有效的方法可以做到这一点,但考虑到我的时间限制和我的精神能力,我认为我无法将其提交。
然而,它不起作用。我要 post 一个例子,说明我如何在随机函数上实现撤消功能和盗版 deepcopy
,因为代码本身超长并且使用另一种语言
我希望我说得足够清楚,如果有任何误解,我会编辑post。
main_list = [list of lists that have elements in them]
def bootleg_deepcopy(main_list):
new_list = []
for x in main_list:
nx = x[:]
new_list.append(nx)
return new_list
def delete_elements(main_list,user_input,undolist):
#function that deletes elements from the list if a condition isn't met
undolist.append(bootleg_deepcopy(main_list))
main_list[:] = [element for element in main_list if not function_that_checks_something(whatever,something)]
return main_list
def undo(main_list,undolist):
try:
main_list = undolist.pop()
except Exception as ex:
print(ex)
return main_list
您的撤消操作只是 returns 对 main_list 的新引用。您的 delete_elements 方法会就地覆盖 main_list (main_list[:] = ...
)。我假设您希望在撤消操作中有相同的行为,以便所有包含对 main_list 的引用的地方都会自动更新。
解决方案是在 undo()
函数中使用切片运算符 (?)。我对其进行了编辑,使其包含正确的代码。
def undo(main_list,undolist):
try:
main_list[:] = undolist.pop()
except Exception as ex:
print(ex)
return main_list