免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3824 | 回复: 4
打印 上一主题 下一主题

在"for xxx in yyy"中,我们得到的xxx是什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-23 17:00 |只看该作者 |倒序浏览
对一个简单的list循环,并尝试改变其值,结果没有发生变化



对一个dictionary的list循环,则可以改变list的值

论坛徽章:
0
2 [报告]
发表于 2011-05-23 17:12 |只看该作者
你要知道,所有的变量名都仅仅是引用

在"for i in (1,2,3)"里,i会分别指向1,2,3
之后你用i=0,按你的想法就相当于1=0,2=0,3=0,这是完全不可能发生的
实际发生的情况是,变量i改为指向0

后一个例子你并没有给i直接赋值,而是操作i的属性,这是完全可以的
虽然前一个例子中理论上你也可以尝试修改i的属性,但整数是不可变类,你真的去修改的话会报错

论坛徽章:
0
3 [报告]
发表于 2011-05-23 17:15 |只看该作者
python内建类型分为可变的和不可改变的
list1 = [1, 2, 3]
for i in list1:
    i = 0
这里i是int类型,是不可变对象,对于每一次循环获得的i仅仅是值相同的另外一个对象而已。
循环内所做的任务操作都不会影响到list1中的对象。
对于dict:
for i in dict:
    i['id'] = i['id'] + 1
循环中的每个i对象是一个dict对象,是mutable,因此他们都是dict每个元素的引用而已,都指向了同一个对象,所有循环内部对元素的操作影响到了原来的对象。

论坛徽章:
0
4 [报告]
发表于 2011-05-24 08:48 |只看该作者
谢谢!

查了一些文档中关于mutable和immutable的资料,有一些收获

但这里的问题与mutable/immutable还完全是一回事
比如list是一个mutable的数据类型
list = [[1,2],[3,4]]
for i in list:
     i = []    #这个肯定是不行的
     i.pop() #这个就是可以的

所以我觉得这里我是搞混了变量和对象实例的关系
变量可以通过赋值来改变,对象实例则不能通过赋值来改变内容
而for xxx in yyy中得到的xxx应该就是对象实例
如果这个对象的类型是mutable的,那xxx可以改变,否则不可改变
但是这种改变不能通过赋值操作进行

论坛徽章:
0
5 [报告]
发表于 2011-05-24 09:09 |只看该作者
本帖最后由 ccporxy 于 2011-05-24 09:27 编辑

python中的赋值操作符,仅仅是创建一个对象,然后把变量名和对象关联;或者是把变量名和‘=’号右值所引用对象关联,内部通过dict映射来表示。
之前与变量名相关联的对象,则会引用计数-1,然后根据引用计数来判断对象是否该销毁还是继续保留。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP