gpt4 book ai didi

python - 使用非常大的状态在 Python 中撤消。是否可以?

转载 作者:行者123 更新时间:2023-11-28 17:10:43 26 4
gpt4 key购买 nike

这看起来很简单,但我找不到好的解决方案。

这是旧的“按引用传递”/“按值传递”/“按对象引用传递”问题。我明白发生了什么,但我找不到好的解决办法。

我知道小问题的解决方案,但我的状态非常大,保存/重新计算的成本非常高。鉴于这些限制,我找不到解决方案。

这里有一些简单的伪代码来说明我想做什么(如果 Python 让我通过引用传递的话):

class A:
def __init__(self,x):
self.g=x
self.changes=[]
def change_something(self,what,new): # I want to pass 'what' by reference
old=what # and then de-reference it here to read the value
self.changes.append([what,old]) # store a reference
what=new # dereference and change the value
def undo_changes():
for c in self.changes:
c[0]=c[1] # dereference and restore old value

编辑:添加更多伪代码来展示我希望如何使用上面的内容

test=A(1) # initialise test.g as 1

print(test.g)
out: 1

test.change_something(test.g,2)
# if my imaginary code above functioned as described in its comments,
# this would change test.g to 2 and store the old value in the list of changes

print(test.g)
out: 2

test.undo_changes()

print(test.g)
out: 1

显然,由于“通过对象引用传递”,上述代码在 Python 中不起作用。此外,我希望能够撤消单个更改,而不是上面代码中的所有更改。

问题是……我似乎找不到好的解决方法。有这样的解决方案:

Do/Undo using command pattern in Python

making undo in python

其中涉及存储一堆命令。 “撤消”然后涉及删除最后一个命令,然后通过采用初始状态并重新应用除最后一个命令之外的所有内容来重建最终状态。我的状态太大,这不可行,问题是:

  • 该州非常大。完全保存它的成本高得令人望而却步。
  • “Do”操作成本高昂(使得从已保存状态重新计算变得不可行)。
  • Do 操作也是非确定性的,依赖于随机输入。
  • 撤销操作非常频繁

我有一个想法,即确保所有内容都存储在列表中,并编写我的代码以便所有内容都存储、读取和写入这些列表。然后在上面的代码中,每次我想读/写一个变量时,我都可以传递列表名称和列表索引。

从本质上讲,这相当于在 Python 中构建我自己的内存架构和 C 风格的指针系统!这行得通,但似乎有点……荒谬?当然有更好的方法吗?

最佳答案

请检查是否有帮助....

class A:
def __init__(self,x):
self.g=x
self.changes={}
self.changes[str(x)] = {'init':x, 'old':x, 'new':x} #or make a key by your choice(immutable)
def change_something(self,what,new): # I want to pass 'what' by reference
self.changes[what]['new'] = new #add changed value to your dict
what=new # dereference and change the value
def undo_changes():
what = self.changes[what]['old'] #retrieve/changed to the old value
self.changes[what]['new'] = self.changes[what]['old'] #change latest new val to old val as you reverted your changes

对于每个更改,您都可以更新 change_dictionary。您唯一需要弄清楚的是“如何为 self.change 字典中的键创建条目”,我只是将其设为 str(x),只需检查类型(什么)以及如何使其成为您的键案例。

关于python - 使用非常大的状态在 Python 中撤消。是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47687564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com