当前位置:优学网  >  在线题库

关于python中 for循环语句位置顺序的疑问

发表时间:2022-06-20 21:03:16 阅读:42

两个图片中,变化了二三行的位置顺序,其输出结果大不相同。
alien_0在for语句后可以将指定的alien变为绿色;
alien_0在for语句前,却把所有的alien变为绿色;
为什么会产生这种情况呢?求解答。

🎖️ 优质答案
  • python 对象是以引用的方式存储和传参的。

    alien_0 放在循环里面,每次循环都会创建一个新的 alien_0 对象(一共创建 30 个),auto_aliens.append(alien_0) 添加的都是不同对象。

    alien_0 放在循环外面,对象只创建 1 次,每次循环添加的都是同一个对象,所以只要改一个,其他全都会变,因为数组里每一个元素都是引用同一个对象。

    如果非要放在循环外面,可以每次循环复制一次,即把添加语句改为

    auto_aliens.append(alien_0.copy())
  • 如果不是确定生成了一个新的对象还是原来的对象,可以使用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的对象,所以都会发生变动.

  • 相关问题