请教个问题
Topic sourcel = [] 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中的每一个元素都是相同的。
第一次循环的时候, 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)
我自己的理解:用append 对列表进行赋值,是将该值的地址赋给了列表。正常情况下,如果该字符串改变,实际上是在内存中另外开辟了一个存储空间, 原来地址存储的数值仍然在内存中保存着。而对于字典来说,由于关键字一样,所以直接在原内存地址指向的空间进行内容修改,原内容彻底改变。所以列表中保存的第一个l[0]也会跟着改变。这就导致了虽然循环了两次,但是列表中最终保存的都是循环最后一次的数值。
渣渣一枚... l=[] d={'a':0} l.append(d) print(l) d['a']=1 print(l) 结果如下 [{'a': 0}] [{'a': 1}] 可见haha同学是对的.哈哈哈....
看看这个模拟过程: 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
peifan有梦想
为什么不是 [{'a':0}, {'a':1}] ? 谁能解释下..