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

Python脚本中单独使用if条件为何无法正常工作?

问题描述

我编写了一个简单的Python脚本,用于创建一个7×7的点('.')列表,想要将对角线元素改为星号('*')。脚本代码如下:

n=7
l=['.']*n
m=[l]*n
for i in range(n):
    for j in range(n):
        if i==j:
            m[i][j]='*'
    print(*m[i])

实际输出如下:

* . . . . . .
* * . . . . .
* * * . . . .
* * * * . . .
* * * * * . .
* * * * * * .
* * * * * * *

我不理解为何会得到这样的输出,添加else语句后脚本就能正常运行,请问我忽略了什么细节?

问题原因与解决方法

核心问题出在列表的引用复制上:

  • 当你用 m=[l]*n 创建二维列表时,并不是生成了n个独立的l列表,而是让m里的每个元素都指向同一个l列表对象。也就是说,m[0]、m[1]...m[6]都是同一个列表的引用,修改其中任意一个,其他所有都会跟着变。
  • 你的循环中,第一次i=0时,把m[0][0]改成*,其实是修改了共享的那个列表的第0位;第二次i=1时,把m[1][1]改成*,也就是共享列表的第1位,这时候共享列表已经变成['*', '*', '.', '.', '.', '.', '.'],所以打印m[1]的时候就会显示前两个星号,以此类推,最终每一行都会累积之前的修改,出现全左三角星号的结果。

至于添加else语句后正常,是因为else里你应该是把非对角线元素重新设为.,相当于每次循环都把共享列表的其他位置重置,覆盖了之前的修改,才让对角线看起来正常,但这本质上还是绕开了引用问题,不是正确的解决方式。

正确的做法是创建独立的子列表,避免引用共享:

n=7
# 用列表推导式生成每个独立的子列表
m=[['.']*n for _ in range(n)]
for i in range(n):
    m[i][i]='*'
    print(*m[i])

这样每个子列表都是独立的对象,修改m[i][i]只会影响当前行的对应位置,就能得到正确的对角线星号输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:30:59