使用numpy.repeat创建集合数组时集合不独立的原因是什么
问题原因
np.repeat处理Python可变对象时,只会重复存储对象的引用,不会创建新的独立对象。你传入np.repeat(set(), 3)时,整个流程里只创建了1个空集合实例,生成的长度为3的numpy数组里,三个索引位置存的全是指向这同一个集合的内存地址,本质上三个位置指向的是同一个东西。
这种情况下不管你给哪个索引对应的集合加元素,修改的都是那唯一的一个集合对象,打印时三个位置自然会同步显示修改后的结果。
你可以用id()函数验证三个元素的内存地址:
import numpy as np array_3_sets = np.repeat(set(), 3) print(id(array_3_sets[0]), id(array_3_sets[1]), id(array_3_sets[2]))
运行后会看到三个ID完全相同,证实三个位置指向同一个集合对象。
正确写法
要得到三个互相独立的集合,不能直接用np.repeat传入单个集合实例,需要在生成数组时为每个位置创建全新的集合对象,用列表推导即可实现:
import numpy as np array_3_sets = np.array([set() for _ in range(3)]) print(array_3_sets) array_3_sets[0].add(0) array_3_sets[1].add(1) print(array_3_sets)
运行后就能得到预期输出:
[set() set() set()] [{0} {1} set()]
注意:这个问题不是set独有的,所有Python可变对象(列表、字典、自定义类实例等)用
np.repeat批量填充时都会出现同样的引用复用问题。
内容的提问来源于stack exchange,提问作者Miguel Branchtein
相关产品推荐
相关产品推荐

