为什么这段Python代码生成的列表所有元素取值都完全相同?
问题根因
问题出在list = [[None]]*n这行代码的执行逻辑:
- Python 中使用
*对列表做乘法复制时,只会复制列表内元素的引用,不会生成新的独立对象。这行代码执行后,外层列表的n个元素实际上是同一个[None]列表对象的引用,所有子列表本质上是同一个内存地址的内容。 - 后续循环中每次修改
i[0],都是在修改同一个子列表的第一个元素,最后一次赋值的随机数自然会同步出现在所有子列表的对应位置,看起来就是所有条目值都相同。
修正方案
需要在生成外层列表时,每次都创建独立的子列表,避免引用重复,同时建议不要用list作为变量名,会覆盖Python内置的list类型:
import random n = 5 # 推导式每次生成新的[None]子列表,互相独立 my_list = [[None] for _ in range(n)] for i in my_list: i[0] = random.uniform(0, 1) print(my_list)
内容的提问来源于stack exchange,提问作者Carla only proves trivial prop
相关产品推荐
相关产品推荐

