关于python中for循环的问题?

最近在做数据分析的练习时,对一段 python 代码中的 for 循环不是很理解,代码如下:

print('修正数据类型(数据清理)')
import unicodecsv
from datetime import datetime as dt


def read_csv(filename):
    with open(filename, 'rb') as f:  
        reader = unicodecsv.DictReader(f)
        return list(reader)     
 
def parse_date(date):     #将字符串的date转换成python的日期时间对象
    if date == '':        #检查日期是否为空字符串
        return None
    else:
        return dt.strptime(date, '%Y-%m-%d') #将字符串解析成日期

 
daily_engagement = read_csv('daily-engagement.csv')
print(daily_engagement[0])
 
# 清理 engagement 的数据类型
for engagement_record in daily_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.3k
2 个回答

for i in [v1,v2,v3]:
i记录的是变量 v* 的地址,
如果变量是字符串, 修改i, v* 没有变化,
如果变量是列表, 那么 v1[0] === i[0]
他们共用一个地址,

#!/usr/bin/python3

a = [[1,2],[1,2],[1,2],[1,2],[1,2]]

for i in a:
    i[0] = 5

print(a)

daily_engagement是一个 list,保留了对每一个 engagement_record 的引用。

前后两次 engagement_record[0] 取得都是同一个engagement_record,是这个engagement_record中的一个字段被改变了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏