对象的引用(变量)

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 的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值