aliens=[] for alien_number in range(30): new_alien={"color":"green","points":5,"speed":"slow"} aliens.append(new_alien) print(aliens) 和 aliens=[] new_alien = {"color": "green", "points": 5, "speed": "slow"} for alien_number in range(30): aliens.append(new_alien) print(aliens) 区别:
这两个代码片段虽然看起来非常相似,但它们在行为上有一个关键的区别,主要体现在对象的引用上。具体来说,区别在于每次循环时是否创建了新的字典对象。
代码片段 1:每次循环创建新的字典对象
Python复制
aliens = []
for alien_number in range(30):
new_alien = {"color": "green", "points": 5, "speed": "slow"}
aliens.append(new_alien)
print(aliens)
行为分析
-
在每次循环中,
new_alien
被重新赋值为一个新的字典对象{ "color": "green", "points": 5, "speed": "slow" }
。 -
因此,每次调用
aliens.append(new_alien)
时,都会将一个独立的字典对象添加到列表aliens
中。 -
结果是,
aliens
列表中包含了 30 个独立的字典对象,每个对象都是独立的,互不影响。
输出示例
Python复制
[
{"color": "green", "points": 5, "speed": "slow"},
{"color": "green", "points": 5, "speed": "slow"},
...
{"color": "green", "points": 5, "speed": "slow"}
]
代码片段 2:始终引用同一个字典对象
Python复制
aliens = []
new_alien = {"color": "green", "points": 5, "speed": "slow"}
for alien_number in range(30):
aliens.append(new_alien)
print(aliens)
行为分析
-
在循环开始之前,
new_alien
被赋值为一个字典对象{ "color": "green", "points": 5, "speed": "slow" }
。 -
在每次循环中,
aliens.append(new_alien)
将 同一个字典对象的引用 添加到列表aliens
中。 -
因此,
aliens
列表中包含的 30 个元素实际上引用的是同一个字典对象。
输出示例
Python复制
[
{"color": "green", "points": 5, "speed": "slow"},
{"color": "green", "points": 5, "speed": "slow"},
...
{"color": "green", "points": 5, "speed": "slow"}
]
虽然输出看起来相同,但它们的行为有本质区别。如果修改任何一个字典对象,所有引用该对象的地方都会受到影响。
验证示例
Python复制
# 修改第一个字典对象
aliens[0]["color"] = "red"
# 打印结果
print(aliens[0]) # 输出:{"color": "red", "points": 5, "speed": "slow"}
print(aliens[1]) # 输出:{"color": "red", "points": 5, "speed": "slow"}
print(aliens[29]) # 输出:{"color": "red", "points": 5, "speed": "slow"}
可以看到,所有字典对象的颜色都被修改为 "red",因为它们实际上引用的是同一个对象。
总结
-
代码片段 1:每次循环创建一个新的字典对象,列表中包含 30 个独立的对象。
-
代码片段 2:始终引用同一个字典对象,列表中包含 30 个相同的引用,修改其中一个会影响所有引用。
在实际开发中,如果需要独立的对象,应该使用代码片段 1 的方式。如果需要节省内存且不需要独立修改每个对象,可以使用代码片段 2 的方式。