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
相关产品推荐
相关产品推荐

