python 重复元素数组构建陷阱

注:做二叉搜索树算法题时遇到,出现了递归栈溢出的报错问题

class BST:
    def __init__(self,):
        self.value = None
        self.left = None
        self.right = None
        
def Create(node_number):
	"""根据结点个数构建完全二叉树,特殊方法"""
    a = [BST()]* (node_number+1)
 #  a = [BST() for _ in range(node_number+1)]
    i =1 
    while i*2 <= node_number:
        a[i].left = a[i*2]
        if i*2+1 <= node_number:
            a[i].right = a[i*2+1]
        i+=1
    return a[1]

treex = Create(9)
treex.left
<__main__.BST at 0x1d3b081e4e0>
treex.left.left
<__main__.BST at 0x1d3b081e4e0> #你会发现所有结点地址都一样,问题出在哪?

问题所在-数组构建方式

python会为了节省内存,当你使用如下方式构建大量重复元素的数组的时候,元素就是单纯的复制,并不会生成单独不同的个体

a = [BST()]* 5
# 检验一下
a
[<__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>]
 # 地址全部相同,不明白的建议学一下C语言

解决方案

 a = [BST() for _ in range(5)]
 a
 [<__main__.BST at 0x1d3b0808550>,
 <__main__.BST at 0x1d3b0808470>,
 <__main__.BST at 0x1d3b0808390>,
 <__main__.BST at 0x1d3b08081d0>,
 <__main__.BST at 0x1d3b0808780>]
 #  地址各不相同

总结

如果单纯的是初始化数组,没有多大影响,但是如果后续操作存在数组内指针指向的话,将会引起严重错误,指针将永远指向一个相同的元素(你原以为下标不同,元素也不同)。递归的时候将会栈溢出
比如二叉树的左右子节点的指向

发布了48 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/NewDreamstyle/article/details/103368035
今日推荐