You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中yh=[[]]*num语句含义 嵌套列表与杨辉三角代码答疑

Python语句yh = [[]] * num含义解析

语句的底层逻辑

Python中对列表使用*做重复运算时,不会为可变类型元素创建新副本,仅会复制元素的引用。yh = [[]] * num的实际执行逻辑是:

  • 创建一个长度为num的外层列表
  • 列表中所有位置存储的都是同一个空列表对象的内存地址,而非num个互相独立的空列表

这种写法存在典型的引用复用陷阱:如果后续对其中任意一个位置的空列表做修改(比如append元素、修改下标值),所有位置对应的列表都会同步变化,因为它们本质指向同一个内存对象。

num=3时的实际结果

执行该语句不会得到yh = [[[]],[[]],[[]]]。
当num=3时,语句执行后得到的实际结果是[[], [], []],是两层结构的列表:外层长度为3,每个元素是同一个空列表引用。提到的[[[]],[[]],[[]]]是三层结构,每个外层元素是一个包含空列表的独立列表,和实际结果完全不符。

对应杨辉三角代码的运行说明

题目给出的杨辉三角实现代码如下:

def main():
    num = int(input('Number of rows: '))
    yh = [[]] * num
    for row in range(len(yh)):
        yh[row] = [None] * (row + 1)
        for col in range(len(yh[row])):
            if col == 0 or col == row:
                yh[row][col] = 1
            else:
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print(yh[row][col], end='\t')
        print()


if __name__ == '__main__':
    main()

这段代码虽然初始用了有引用陷阱的写法,但可以正常运行,核心原因是循环中存在覆盖引用的操作yh[row] = [None] * (row + 1):这行代码会给yh的第row个位置重新赋值一个全新的独立列表,直接覆盖了初始状态下指向共同空列表的引用,后续修改每行内容时不会出现多行动态联动的bug。

日常开发如果需要生成独立的嵌套空列表,更安全的写法是用列表推导式避免引用复用:

yh = [[] for _ in range(num)]

这种写法生成的每个空列表都是独立对象,不会出现引用共用的问题。


内容的提问来源于stack exchange,提问作者jackey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:42:50