鱼C论坛

 找回密码
 立即注册
查看: 2962|回复: 10

为什么这个函数局部变量可以改变全局变量?

[复制链接]
发表于 2020-1-12 13:58:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. result = []
  2. def get_digits(n):
  3.     if n > 0:
  4.         result.insert(0, n % 10)
  5.         get_digits(n // 10)

  6. get_digits(123)
  7. print(result)
复制代码

变量result
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-12 14:14:25 | 显示全部楼层
在函数中可以调用全局变量的方法和属性,因此可以改变全局变量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-12 14:31:46 | 显示全部楼层
zltzlt 发表于 2020-1-12 14:14
在函数中可以调用全局变量的方法和属性,因此可以改变全局变量。

如何调用属性?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 14:49:30 | 显示全部楼层

例如:print(result.__dict__)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 15:05:08 | 显示全部楼层
容器类型(字符串,列表,元祖等等)不存放在栈里面,可以在外部函数和内部函数之间进行数据交换、赋值及修改,所以这里能修改全局的列表类型变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-12 15:17:18 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-12 15:19 编辑

        在函数 get_digits(n) 中,变量 result 被引用在先,但是,该变量事先既未通过赋值定义,也不是函数输入参数,所以,result 注定不是局部变量,只能是全局变量。在 Python 语言中,在未使用 global 语句声明的前提下,不允许为全局变量赋值,但是,通过对象的方法修改对象是允许的。在本例中,result.insert(0, n % 10) 语句就是通过列表的方法为列表添加新元素的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 15:37:25 | 显示全部楼层
zltzlt 发表于 2020-1-12 14:14
在函数中可以调用全局变量的方法和属性,因此可以改变全局变量。

我不认同,函数局部可以改变全局变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 15:39:14 | 显示全部楼层
Stubborn 发表于 2020-1-12 15:37
我不认同,函数局部可以改变全局变量

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 16:28:31 | 显示全部楼层

这里,result为列表,往里面添加值,并不算改变result的值,打印原来的ID值,和添加值之后的ID,肯定是一样的。如果没有声明要修改全局变量,肯定是不能修改的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 16:32:35 | 显示全部楼层
Stubborn 发表于 2020-1-12 16:28
这里,result为列表,往里面添加值,并不算改变result的值,打印原来的ID值,和添加值之后的ID,肯定是一 ...

是不能直接修改,但是可以通过方法修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-12 16:35:11 | 显示全部楼层
zltzlt 发表于 2020-1-12 16:32
是不能直接修改,但是可以通过方法修改

列表有限的几个方法,返回一个新的列表,也是类似copy后的结果,请教下有什么方法,可以不声明,进行修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-21 18:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表