python - 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
显然,我缺少关于如何在函数内部处理全局变量和局部变量的核心概念,但似乎无法在线找到任何信息。有人可以解释为什么对象在索引时会在函数内部发生变化吗?另外,有人可以描述如何避免这个“功能”,以便当我在函数中索引对象(列表、数组等)时,我不会无意中更改在该函数之外定义的对象?谢谢!
解决方案
请查看我最近对一个密切相关的问题的回答:https ://stackoverflow.com/a/69303154/8431111
您的示例有两个概念:
- 分配与参考的行为
- 改变单个容器对象
对于第 (1.) 项,当fun
assigns时,由于缺少声明i = 1
,它会创建global
一个新的局部变量。
对于第 (2.) 项,让我们考虑这个稍微简单的代码,因为它不会改变基本问题:
img[0] = 100
赋值运算符img
通过首先查询函数的本地范围(未找到)然后在模块的全局范围中找到它来定位。通过对现有img
对象的引用,它然后调用__setitem__
更改第零个元素指向的内容。在这种情况下,它将指向一个不可变int
对象。setter 的赋值由 STORE_SUBSCR 字节码指令执行。
推荐阅读
- node.js - 如何使用 Firebase 管理 API 创建 passwordResetLink?
- angular - 路由使用参数在父组件之前执行子组件
- swift - 获取图像后,uiimageview 不显示任何内容
- javascript - 如何为材料表 [dataSource] 正确格式化此数据?
- python - 与不同的模块共享一个功能
- mysql - 在 Mysql 8 中选择顺序表时出现语法错误
- php - phpmyadmin 中的错误 - `缺少 mysqli 扩展`
- serial-port - rs-232的通讯参数是由我们决定还是由设备决定?
- extjs - 根据其他组合框中的值填充组合框存储
- java - 在 Spring Boot 2.0.4 中从 http 重定向到 https