python 代码疑问

2016-09-18 16:13:13 +08:00
 Chyroc

为什么输出是[{'key': 'b'}, {'key': 'b'}, {'key': 'b'}, {'key': 'b'}]

a 去哪了

2630 次点击
所在节点    Python
17 条回复
zhuangzhuang1988
2016-09-18 16:24:53 +08:00
stargazer
2016-09-18 16:26:39 +08:00
if True 。。。。。
stargazer
2016-09-18 16:31:34 +08:00
啊,少看一行....append 的是地址引用的 item ,所以你 item 修改了 key 的值, items 里的值也就被修改了,如果你 append 的是 deepcopy 的就是另外一个样,你可以试试没有 for 循环的,另外 for 循环每进行一次, item 都是一个新的对象,以上
jy02201949
2016-09-18 16:31:43 +08:00
if True 然后来问 a 去哪了
kimchan
2016-09-18 16:33:22 +08:00
你 append 的第一个 item 是字典的地址, 而不是字典的值...所以你后面改了字典的值, 自然变成 b 了..
xubingok
2016-09-18 17:31:17 +08:00
@zhuangzhuang1988
这个网站真是屌爆了...
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))
你就明白了.
dishonest
2016-09-18 18:16:20 +08:00
对 item 的两次操作都作用在同一个 dict 对象
aiver
2016-09-18 18:31:54 +08:00
python 里面“一切皆对象”, items 里面存储的只是 item 地址而不是值,即“存引用而不存值”,当你改变了 item 里面的值后, items 里面的值当然也跟着变化啦
zhoulouzi
2016-09-18 22:17:09 +08:00
dict key 。
leavic
2016-09-18 22:48:12 +08:00
if 'True 是什么鬼?
Chyroc
2016-09-18 22:58:06 +08:00
@stargazer
@jy02201949
@leavic
实际判断的是别的,此处用 if True 说明
Chyroc
2016-09-18 22:58:49 +08:00
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 是不一样的
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'}
’‘’‘
Allianzcortex
2016-09-19 09:44:23 +08:00
之前在 V 站就回答过这类问题⊙﹏⊙b 汗,还是 mutable 和 immutable 的问题。 Python 是 reference by object 的语言,你试试 copy.copy(item) 后再改变 item 的值。
CallMeZ
2016-09-19 10:05:05 +08:00
@zhuangzhuang1988 强,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/307027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX