为何代码中数组a[0][0]至a[0][3]的元素值异常变更?
问题根源与解决方案
你碰到的这个问题其实是Python里创建二维列表时很容易踩的一个坑,核心原因出在二维数组的初始化方式上:
为什么会出现值被覆盖?
你用了a = [[0] * 4] * 2来创建二维数组,但这行代码并没有生成两个独立的长度为4的子列表——它只是把同一个[0,0,0,0]列表的引用复制了两次。也就是说,a[0]和a[1]指向的是内存里的同一个列表对象。
当你的循环执行到j=1时,你给a[1][i]赋值的操作,本质上是在修改那个唯一的子列表,这就会把j=0时给a[0][i]赋的值全部覆盖掉。所以第一次循环输出的是赋值过程中的临时状态,而第二次输出时,子列表已经被最后一次赋值(j=1时的操作)完全覆盖了。
如何修复?
要创建真正独立的二维列表,你需要确保每个子列表都是新的对象,推荐用列表推导式来初始化:
inputBin = list(input("Enter a binary number (max. 8 bits): ")) # 用列表推导式创建两个独立的子列表 a = [[0] * 4 for _ in range(2)] for j in range(2): for i in range(4): a[j][i] = int(inputBin[(2 * j) ** 2 + i]) print("a[",j,"] [",i,"] = ", a[j][i]) for j in range(2): for i in range(4): print("a[",j,"] [",i,"] = ",a[j][i])
验证结果
当你输入11000011后,两次输出会完全一致:
- 第一次循环输出:
a[0][0]=1、a[0][1]=1、a[0][2]=0、a[0][3]=0,接着a[1][0]=0、a[1][1]=0、a[1][2]=1、a[1][3]=1 - 第二次循环输出:
a[0]的四个值保持1、1、0、0,a[1]的四个值保持0、0、1、1
内容的提问来源于stack exchange,提问作者Thean Jun Chao
相关产品推荐
相关产品推荐

