首页 > 解决方案 > Python 列表(和其他对象)在函数内被索引时发生变化

问题描述

我对 Python 的(有限)理解是,即使在函数内部进行了修改,在函数外部定义的对象也应该保持不变,即

def fun():
    i=1
    return('done')

i=0
fun()
i==0 ## True

但是,列表(和其他对象,如 numpy 数组)在函数内索引时会发生变化:

def fun():
    img[0] = img[0] + 100 
    return('done')

img = [0, 1]
fun()
img == [0, 1] ## False

显然,我缺少关于如何在函数内部处理全局变量和局部变量的核心概念,但似乎无法在线找到任何信息。有人可以解释为什么对象在索引时会在函数内部发生变化吗?另外,有人可以描述如何避免这个“功能”,以便当我在函数中索引对象(列表、数组等)时,我不会无意中更改在该函数之外定义的对象?谢谢!

标签: pythonpython-3.xfunctionglobal-variables

解决方案


请查看我最近对一个密切相关的问题的回答:https ://stackoverflow.com/a/69303154/8431111

您的示例有两个概念:

  1. 分配与参考的行为
  2. 改变单个容器对象

对于第 (1.) 项,当funassigns时,由于缺少声明i = 1,它会创建global一个新的局部变量。

对于第 (2.) 项,让我们考虑这个稍微简单的代码,因为它不会改变基本问题:

    img[0] = 100 

赋值运算符img 通过首先查询函数的本地范围(未找到)然后在模块的全局范围中找到它来定位。通过对现有img对象的引用,它然后调用__setitem__ 更改第零个元素指向的内容。在这种情况下,它将指向一个不可变int对象。setter 的赋值由 STORE_SUBSCR 字节码指令执行。


推荐阅读