如何解决如何在Python中将变量的值设置为另一个变量即列表的值
我目前有一个具有2个属性的类,initial_value
和current_value
。
两者都是列表,并且初始值是在运行时通过编程设置的,并不总是相同的。
它们以相同的方式开始,但是在整个代码中,current_value
发生了变化。
然后,我需要将其重置为initial_value
,但是我想知道在不影响我的代码initial_value
的情况下实现此目的的最佳方法。
这是由于指针更改为与initial value
相同的对象而无法正常工作的原因:
class MyClass:
def __init__(self,v1,v2,v3,v4,v5,v6):
## both initial value and current value get set as the same value during run time
self.initial_value = [[v1,v3],[v4,v6]]
self.current_value = [[v1,v6]]
def Reset(self):
self.current_value = self.initial_value ### what is the best way to fix this?
myclass = MyClass(1,2,3,4,5,6)
# value of current_value will change throughout the program
myclass.current_value[0][0] = 5
# periodically,need to reset
myclass.Reset()
我面临的挑战是Reset
函数被调用很多次,所以我试图找到实现此结果的最快方法。
到目前为止,我能想到的最好的方法是:
self.current_value = [*self.initial_value]
自学成才,我只是不知道实现这一目标的最惯用和有效的方法。
非常感谢高级!
解决方法
有许多处理方式。我自己将创建get_init_values()
方法,该方法返回列表的初始值:
class MyClass:
def __init__(self):
# self.initial_value = self.get_init_values() # now the initial value is not needed,all is handled by get_init_values()
self.current_value = self.get_init_values()
def get_init_values(self):
return [[1,2,3],[4,5,6]]
def Reset(self):
self.current_value = self.get_init_values()
myclass = MyClass()
# value of current_value will change throughout the program
myclass.current_value[0][0] = 5
# periodically,need to reset
myclass.Reset()
编辑:针对构造函数中的初始值进行了更新:
class MyClass:
def __init__(self,v1,v2,v3,v4,v5,v6):
self.__values = [v1,v6]
self.current_value = self.get_init_values()
def get_init_values(self):
return [self.__values[0:3],self.__values[3:6]]
def Reset(self):
self.current_value = self.get_init_values()
myclass = MyClass(1,3,4,6)
# value of current_value will change throughout the program
myclass.current_value[0][0] = 5
# periodically,need to reset
myclass.Reset()
print(myclass.current_value)
,
问题在于列表是容器,容器的分配会创建对现有容器的新引用,而不是容器的新副本。您有一个包含其他容器的容器(列表列表),这意味着您必须确保要复制所有列表,而不仅仅是顶层列表。这就是copy.deepcopy()
存在的原因。
import copy
class MyClass:
...
def Reset(self):
self.current_value=copy.deepcopy(self.initial_value)
例如,copy.deepcopy()
的替代方案是如果您的项目具有固定的结构,您知道它们始终是列表的列表,则可以使用列表推导来创建副本:
def Reset(self):
self.current_value=[lst[:] for lst in self.initial_value]
测试这两种方法表明理解速度要快得多:
In [1]: import copy
In [2]: iv = [range(100) for _ in range(10)]
In [3]: %timeit copy.deepcopy(iv)
47.8 µs ± 593 ns per loop (mean ± std. dev. of 7 runs,10000 loops each)
In [4]: %timeit [lst[:] for lst in iv]
2.63 µs ± 33.1 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
,
您尝试过self.current_value = self.initial_value
吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。