为什么Python列表列表的行为取决于声明?

时间:2019-05-20 08:46:00

标签: python list

我正在尝试在Python的另一个列表中创建一个列表。我注意到根据声明,最终(外部)列表的行为有所不同。

我试图用两种不同的方式创建列表列表。两种情况都给我不同的结果。

#Case 1
def test():
    lt1 = lt2 = list()
    for i in range(0, 10):
        for j in range(0, 2):
            lt1.append(j);
        lt2.append(lt1);
        lt1 = [];
    print (lt2)

if __name__ == "__main__":
    test()
#Case 2
def test():
    lt1 = list()
    lt2 = list()
    for i in range(0, 10):
        for j in range(0, 2):
            lt1.append(j);
        lt2.append(lt1);
        lt1 = [];
    print (lt2)

if __name__ == "__main__":
    test()

在情况1中,输出为 [0,1,[...],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0, 1],[0、1],[0、1]]

在情况2中,输出为 [[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[ 0,1],[0,1]] 这是我实施的预期答案。

我想知道为什么第一个代码段的行为有所不同。

1 个答案:

答案 0 :(得分:2)

是因为第一行:

>>> a = b = []
>>> a
[]
>>> b
[]
>>> a is b
True
>>> a = []
>>> b = []
>>> a is b
False
>>> 

与情况1一样只有一行,它包含相同的对象,因此:

>>> a = b = []
>>> a.append(1)
>>> a
[1]
>>> b
[1]
>>> 

两行都不会发生:

>>> a = []
>>> b = []
>>> a.append(1)
>>> a
[1]
>>> b
[]
>>> 

因为情况1的第一行具有ab是完全相同的对象,与第二个案例的第一行不同,它们是相同的值,但是不同的idid(a) == id(b)a is b相同)。