python两种创建列表方式在更新后的区别

用for循环创建一个二维列表,和用乘号*创建一个二位列表,输出的结果一摸一样,
但是在操作之后就不一样了
代码如下:

im,jm = 4,4
sign1 = []
sign2 = []
temp = []
for i in range(im):
    for j in range(jm):
        temp.append(True)
    sign1.append(temp)
    temp = []

print(sign1,'\n')

sign2 = [[True]*jm]*im
print(sign2,'\n')

sign1[0][0] = False
sign2[0][0] = False

print(sign1,'\n')
print(sign2,'\n')


结果如下

 [[True, True, True, True], 
 [True, True, True, True], 
 [True, True, True, True], 
 [True, True, True, True]] 

[[True, True, True, True],
[True, True, True, True], 
[True, True, True, True], 
[True, True, True, True]] 

[[False, True, True, True], 
[True, True, True, True], 
[True, True, True, True], 
[True, True, True, True]] 

[[False, True, True, True],
[False, True, True, True], 
[False, True, True, True], 
[False, True, True, True]] 

(为了方便大佬们看,我自己加了换行)

我觉得你第二个之所以不正确,是因为python你写了第一个[True, True, True, True]之后,自动的转为引用方式,而不是直接创建新地址存放,所以你修改一个,其他的地方也会被干扰

https://www.cnblogs.com/woshare/p/5823303.html
参考这篇,实际上[[True]*jm] 是作为一个整体的,所以后面赋值时,会同步生效