python【变量在循环外】和【变量在循环内】的输出效果为什么不一样?
在阅读《图灵程序设计丛书.Python编程_从入门到实践》P93-P95时;
遇到变量在for循环外和循环内导致最终的输出效果不一样,一直不太理解。
请注意加粗字体的部分描述。
【变量在for循环内】
# 创建一个用于存储外星人的空列表;
aliens = []
# 创建N个绿色的外星人列表,每个列表元素都是相同的字典.
for alien_number in range (0,10):
# 创建字典new_alien,变量new_alien在【循环内】
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
# 输出列表核实N个元素全部都是字典
print(aliens)
print('-----------------------------\n')
# 编写了一条if语句来确保只修改绿色外星人
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
#
print("aliens[2] : " + str(aliens[2]))
print("aliens[4] : " + str(aliens[4]))
print('\n')
# 显示前五个外星人
for alien in aliens[:5]:
print(alien)
print('...')
print('')
# 显示创建了多少个外星人
print("Total number of aliens: " + str(len(aliens)))
输出效果:
【变量在for循环内】
# 创建一个用于存储外星人的空列表
aliens = []
# 变量在【循环外】
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
# 创建30个绿色的外星人,引用循环外的变量new_alien
for alien_number in range (0,10):
aliens.append(new_alien)
# 列表切片输出
print(aliens)
print('')
# 遍历列表切片【但是,为什么输出效果等同于遍历整个列表】?
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
# 显示前五个外星人
for alien in aliens[0:5]:
print(alien)
输出效果:
问题:
当引用循环外的变量new_alien时,为什么 - - -
for alien in aliens[0:3] 的输出为什么等同于for alien in aliens:
for alien_number in range (0,10):
# 创建字典new_alien,变量new_alien在【循环内】
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
print(id(new_alien)) # 每个外星人只是值相同,改变某个外星人属性不影响其他的
当new_alien变量在循环内时,你是创建了十个不同的对象(内存位置不同),当new_alien在循环外时,你是把一个外星人添加了十次。
我尝试着这么理解:
当new_alien变量在循环内时,创建了10个不同的对象(内存位置不同);
而new_alien在循环外时,是对一个对象操作了10次;
请问,是这么个理解角度么?
谢谢
昨晚左了下功课,结合自己的理解mark下
作用域不一样;
初始化在外面,全局变量,后面的循环使用前面循环计算后的值;
变量在循环外,在for循环遍历range(10)时,第1次遍历的时候,已经把new_alien变量的值改变了,后面的循环引用的new_alien变量,都是换了值的变量。
初始化在里面,属于局部变量,每次循环都重新初始化,使用这个值来进行新的计算。
变量在循环内,在for循环遍历range(10)时,每次遍历,new_alien变量的值都是初始的值,后面的循环每次引用的new_alien变量,始终都是那个初始变量。
---------------------------
变量在循环外,相当于球赛上,1个球员第1次上场时,把自己的绿色马甲换成黄色马甲,然后每一次比赛都是他披着黄色马甲在场上。穿着黄色马甲的那1个球员打满了所有比赛场次。
变量在循环内,相当于球赛上,上场的球员都会轮替,每次上场的球员都是不同的,但是,只要上场就会把自己的绿色马甲换成黄色马甲。