Discuss / Python / 请教个问题

请教个问题

Topic source

l = [] a = {} for i in range(2): a['a'] = i l.append(a) print(l)

[{'a':1},{'a':1}]

为什么不是 [{'a':0}, {'a':1}] ? 谁能解释下..

l = [] a = {} for i in range(2): a['a'] = i print(id(a)) l.append(a) print(id(l[0]), id(l[1]))

运行代码,可以看到,list中的每一个元素都是指向a的。 所以list中的每一个元素都是相同的。

SX_Chihuahua

#3 Created at ... [Delete] [Delete and Lock User]

第一次循环的时候, a['a'] = 0,这样a是{'a':0},第二次循环的时候, a['a'] = 1,由于a中有了key为‘a’的键值对,所以a变为 {'a':1}.把a定义都循环中就可以了

l = [] for i in range(2): a={} a['a'] = i l.append(a) print(l)

ohaha同学01

#4 Created at ... [Delete] [Delete and Lock User]

我自己的理解:用append 对列表进行赋值,是将该值的地址赋给了列表。正常情况下,如果该字符串改变,实际上是在内存中另外开辟了一个存储空间, 原来地址存储的数值仍然在内存中保存着。而对于字典来说,由于关键字一样,所以直接在原内存地址指向的空间进行内容修改,原内容彻底改变。所以列表中保存的第一个l[0]也会跟着改变。这就导致了虽然循环了两次,但是列表中最终保存的都是循环最后一次的数值。

渣渣一枚... l=[] d={'a':0} l.append(d) print(l) d['a']=1 print(l) 结果如下 [{'a': 0}] [{'a': 1}] 可见haha同学是对的.哈哈哈....

老-党

#6 Created at ... [Delete] [Delete and Lock User]

看看这个模拟过程: l = [] a = {}

a['a'] = 0 print(a) l.append(a) a['a'] = 1 print(a) print(l) l.append(a) print(l)

再看看执行结果: {'a': 0} {'a': 1} [{'a': 1}] [{'a': 1}, {'a': 1}]

有没有瞬间明了


  • 1

Reply