Python实现下一个最近时间:结果异常与深浅拷贝疑问
问题分析与解决方案
首先可以肯定的是,你遇到的这个结果意外变更的问题,确实和Python中可变对象的引用特性(也就是你怀疑的浅拷贝/深拷贝逻辑)直接相关。
为什么用ans = []会出问题?
列表属于Python中的可变对象,当你把一个列表赋值给变量时,变量存储的并不是列表的内容本身,而是指向这个列表在内存中地址的引用。举个简单的例子:
# 初始化一个空列表作为ans ans = [] # 找到19:39时,将时间转为列表赋值给ans current_time = list("19:39") ans = current_time # 后续如果不小心修改了current_time的内容(比如处理其他时间时复用了这个变量) current_time[0] = '1' current_time[1] = '4' current_time[3] = '4' current_time[4] = '4' # 此时ans也会变成['1','4',':','4','4'],因为它和current_time指向同一个内存地址的列表
这就解释了为什么你明明只在19:39时更新过ans,但最终结果却变成了14:44——因为后续代码中对同一个列表对象的修改,会同步影响到ans变量。
而如果当时你用的是不可变类型(比如字符串)来存储时间:
ans = "" # 找到19:39时直接赋值字符串 ans = "19:39" # 后续无论怎么修改其他字符串变量,ans的内容都不会变
因为字符串是不可变对象,赋值时会直接创建新的对象,不存在引用共享的问题。
怎么解决这个问题?
有两种靠谱的处理方式:
- 改用不可变类型存储时间:优先推荐用字符串或者元组来保存时间值,这类对象一旦创建就无法被修改,赋值操作会直接生成新的独立对象,从根源上避免引用导致的意外修改。
- 如果必须用列表,要创建副本:每次更新ans的时候,不要直接赋值列表引用,而是创建一个新的列表副本。比如:
这样ans会指向一个全新的列表对象,后续修改原来的current_time不会再影响到ans的值。# 用copy()方法创建浅拷贝 ans = current_time.copy() # 或者用list()构造新列表 ans = list(current_time)
内容的提问来源于stack exchange,提问作者mourinho
相关产品推荐
相关产品推荐

