最近在做数据分析的练习时,对一段python代码中的for循环不是很理解,代码如下:print('修正数据类型(数据清理)')importunicodecsvfromdatetimeimportdatetimeasdtdefread_csv(filename):withopen(filename,'rb')asf:reader=unicodecsv.DictReader(f)returnlist(reader)defparse_date(date):#将字符串的date转换成python的日期时间对象ifdate=='':#检查日期是否为空字符串returnNoneelse:returndt.strptime(date,'%Y-%m-%d')#将字符串解析成日期daily_engagement=read_csv('daily-engagement.csv')print(daily_engagement[0])#清理engagement的数据类型forengagement_recordindaily_engagement:engagement_record['utc_date']=parse_date(engagement_record['utc_date'])print('\n每日参与学生数据:')print(daily_engagement[0])结果输出如下:修正数据类型(数据清理)OrderedDict([('acct','0'),('utc_date','2015-01-09'),('num_courses_visited','1.0'),('total_minutes_visited','11.6793745'),('lessons_completed','0.0'),('projects_completed','0.0')])每日参与学生数据:OrderedDict([('acct','0'),('utc_date',datetime.datetime(2015,1,9,0,0)),('num_courses_visited','1.0'),('total_minutes_visited','11.6793745'),('lessons_completed','0.0'),('projects_completed','0.0')])在读取了daily-engagement.csv文件后,打印变量daily_engagement[0]时,('utc_date','2015-01-09')中的日期还只是字符串我的问题是,在对变量daily_engagement进行遍历后,为什么在打印同样的daily_engagement时,里面的utc_date就变成了datetime.datetime(2015,1,9,0,0)?我在看这个for循环的时候只看出了对变量engagement_record作了修改,看不出有对daily_engagement作赋值之类的操作,但却能够打印修改后的结果请大神指教个中原理,谢谢!
2 回答
互换的青春
TA贡献1797条经验 获得超6个赞
foriin[v1,v2,v3]:i记录的是变量v*的地址,如果变量是字符串,修改i,v*没有变化,如果变量是列表,那么v1[0]===i[0]他们共用一个地址,#!/usr/bin/python3a=[[1,2],[1,2],[1,2],[1,2],[1,2]]foriina:i[0]=5print(a)
杨魅力
TA贡献1811条经验 获得超6个赞
daily_engagement是一个list,保留了对每一个engagement_record的引用。前后两次engagement_record[0]取得都是同一个engagement_record,是这个engagement_record中的一个字段被改变了。
添加回答
举报
0/150
提交
取消