为什么输出是[{'key': 'b'}, {'key': 'b'}, {'key': 'b'}, {'key': 'b'}]
a
去哪了
1
zhuangzhuang1988 2016-09-18 16:24:53 +08:00 1
|
2
stargazer 2016-09-18 16:26:39 +08:00
if True 。。。。。
|
3
stargazer 2016-09-18 16:31:34 +08:00
啊,少看一行....append 的是地址引用的 item ,所以你 item 修改了 key 的值, items 里的值也就被修改了,如果你 append 的是 deepcopy 的就是另外一个样,你可以试试没有 for 循环的,另外 for 循环每进行一次, item 都是一个新的对象,以上
|
4
jy02201949 2016-09-18 16:31:43 +08:00
if True 然后来问 a 去哪了
|
5
kimchan 2016-09-18 16:33:22 +08:00
你 append 的第一个 item 是字典的地址, 而不是字典的值...所以你后面改了字典的值, 自然变成 b 了..
|
6
xubingok 2016-09-18 17:31:17 +08:00
@zhuangzhuang1988
这个网站真是屌爆了... |
7
kittygirl0070 2016-09-18 17:36:58 +08:00
item['key']=a 和 item['key']=b 这两句当中的 item 是同一个对象(object),你的代码相当于把同一个字典 append 2 次到一个 list ,在一个 for 循环中,第一步 item['key']=a ,第二步把 item 加入 list, 第三步 item['key']=b(因为 if True 相当于不存在,你把这句去掉再看会容易理解),第四步把 item 加入 list. 你的循环体执行2次,所以你的 list 里面实际上是两个不同的字典,第一个和第二个是同一个,第三个和第四个是同一个,尽管这两个字典的内容是相同的,它们的 id 是不一样的.你执行完了自己的代码再试一下:
for item in items: print(id(item)) 你就明白了. |
8
dishonest 2016-09-18 18:16:20 +08:00
对 item 的两次操作都作用在同一个 dict 对象
|
9
aiver 2016-09-18 18:31:54 +08:00
python 里面“一切皆对象”, items 里面存储的只是 item 地址而不是值,即“存引用而不存值”,当你改变了 item 里面的值后, items 里面的值当然也跟着变化啦
|
10
zhoulouzi 2016-09-18 22:17:09 +08:00
dict key 。
|
11
leavic 2016-09-18 22:48:12 +08:00 via iPhone
if 'True 是什么鬼?
|
12
Chyroc OP |
14
eloah 2016-09-18 22:59:41 +08:00
7 楼正解
体会一下, list = [] a = 0 list.append(a) list.append(a) print(list) a = 1 print(list) 对于每一次 for 循环来说,都存在一些局部的变量,就类似于你的那个 i,只存活在循环体中,所以两次循环你的 item 是不一样的 |
15
WangYanjie 2016-09-18 23:18:48 +08:00
Python 用类似指针的概念来指向字典,你的 item 其实只是保存了一个指针,而你之后修改了这个指针指的内存块:
‘’‘ >>> a = {'k': 'x'} >>> c = [a] >>> c [{'k': 'x'}] >>> a {'k': 'x'} >>> a['k'] = 'y' >>> c [{'k': 'y'}] >>> a {'k': 'y'} ’‘’‘ |
16
Allianzcortex 2016-09-19 09:44:23 +08:00
之前在 V 站就回答过这类问题⊙﹏⊙b 汗,还是 mutable 和 immutable 的问题。 Python 是 reference by object 的语言,你试试 copy.copy(item) 后再改变 item 的值。
|
17
CallMeZ 2016-09-19 10:05:05 +08:00
@zhuangzhuang1988 强,哈哈
|