两个图片中,变化了二三行的位置顺序,其输出结果大不相同。
alien_0在for语句后可以将指定的alien变为绿色;
alien_0在for语句前,却把所有的alien变为绿色;
为什么会产生这种情况呢?求解答。
如果不是确定生成了一个新的对象还是原来的对象,可以使用id操作符号进行判断.
id函数可以使用查看python对象的内存地址.
auto_aliens = []
for x in range(0,30):
alien_0 = {'color':'red'}
print(id(alien_0))
auto_aliens.append(alien_0)
结果:
4351848384
4351910248
4351910752
4351910896
4351910968
4351911040
4351911112
4351911184
4351911256
4351911328
4351911400
4351911472
4351911544
4351911616
4351911688
4351911760
4351911832
4351911904
4351911976
4351912048
4351912120
4351912192
4351912264
4351912336
4351912408
4351912480
4351912552
4351912624
4351912696
4351912768
可见, 每次append都是一个新的对象, 内存地址都不同. 因此修改的时候不会互相影响.
auto_aliens = []
alien_0 = {'color':'red'}
for x in range(0,30):
print(id(alien_0))
auto_aliens.append(alien_0)
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
4349948120
此时,都是同一个对象, 后续修改都是在操作id为4349948120的对象,所以都会发生变动.
python 对象是以引用的方式存储和传参的。
alien_0
放在循环里面,每次循环都会创建一个新的alien_0
对象(一共创建30
个),auto_aliens.append(alien_0)
添加的都是不同对象。alien_0
放在循环外面,对象只创建1
次,每次循环添加的都是同一个对象,所以只要改一个,其他全都会变,因为数组里每一个元素都是引用同一个对象。如果非要放在循环外面,可以每次循环复制一次,即把添加语句改为