鱼C论坛

 找回密码
 立即注册
查看: 1683|回复: 12

全局变量和局部变量的小疑惑

[复制链接]
发表于 2017-2-15 20:46:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 凌云裂空 于 2017-2-15 20:48 编辑
  1. dist = []
  2. dimension = 3
  3. def create_dist():
  4.     dist = [0]*(dimension)
  5.     for k in range(dimension):
  6.         dist[k] = [0]*(dimension)
  7.     for i in range(dimension):
  8.         for j in range(dimension):
  9.             dist[i][j] = [0]*(dimension+1)
  10.     print('内层:'+str(dist))
  11.     a = dist
  12.     return

  13. create_dist()
  14. print('外层:'+str(dist))
复制代码

结果:
  1. 内层:[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
  2. 外层:[]
复制代码

各位大神,第一次发帖求助:
        百思不得其解啊,为什么是这种结果啊?我的dist明明是个全局变量,我在第一行明明给赋值了一个空列表。为什么我的函数外层的print语句打印出来的还是一个空的列表呢?就好像dist是个局部变量一样,即使我在前面加了global,结果依然如此。请问这是为什么啊?问题出自哪里?
        另外,这段代码的目的是创建一个三维的列表,请问有没有更直接更高效的方式呢?
        本人小白一枚,第一次发帖提问,如有不妥之处,劳烦各路大神们海涵…^_^
        非常感激!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-15 20:50:04 | 显示全部楼层
  1. dist = []
  2. dimension = 3
  3. def create_dist():
  4.     global dist
  5.     dist = [0]*(dimension)
  6.     for k in range(dimension):
  7.         dist[k] = [0]*(dimension)
  8.     for i in range(dimension):
  9.         for j in range(dimension):
  10.             dist[i][j] = [0]*(dimension+1)
  11.     print('内层:'+str(dist))
  12.     a = dist
  13.     return

  14. create_dist()
  15. print('外层:'+str(dist))
复制代码

你确定你加了 global 吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 20:51:43 | 显示全部楼层
hldh214 发表于 2017-2-15 20:50
你确定你加了 global 吗

我是在最上面加的global dist,结果是一样的,不得其解啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 20:53:54 | 显示全部楼层
hldh214 发表于 2017-2-15 20:50
你确定你加了 global 吗

您好,请问为啥在函数里面加就可以了啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-15 20:56:18 | 显示全部楼层
凌云裂空 发表于 2017-2-15 20:53
您好,请问为啥在函数里面加就可以了啊?

global 关键字是把本来是局部变量强制设为全局
而你说的脚本开始的那个变量已经是狭义的全局变量了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-15 20:58:07 | 显示全部楼层
凌云裂空 发表于 2017-2-15 20:51
我是在最上面加的global dist,结果是一样的,不得其解啊

另外如果单纯只要这种多维数组, 多使用 Pythonic 的方法

  1. print([[[0] * 4] * 3] * 3)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
凌云裂空 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 21:00:36 | 显示全部楼层
hldh214 发表于 2017-2-15 20:56
global 关键字是把本来是局部变量强制设为全局
而你说的脚本开始的那个变量已经是狭义的全局变量了

额,我尝试着理解一下!谢谢啦!
另外我想问一下,用python创建一个3维列表,有什么简便的方法吗?感觉我上面的方法有点笨。。。
万分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-15 21:06:16 | 显示全部楼层
hldh214 发表于 2017-2-15 20:58
另外如果单纯只要这种多维数组, 多使用 Pythonic 的方法

原来可以这样,明白啦!谢谢您!祝好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 11:20:17 | 显示全部楼层
学习到了很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 12:08:50 | 显示全部楼层
global。。得加到内层里面去呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 16:28:54 | 显示全部楼层
从第4行开始,dist貌似变了吧,在函数里面“衍生”了另外一个与全局变量同名的局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-16 16:30:32 | 显示全部楼层
凌云裂空 发表于 2017-2-15 20:51
我是在最上面加的global dist,结果是一样的,不得其解啊

最上面加没用,这不代表什么,global要在作用域里面加在局部变量才有用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-18 10:51:57 | 显示全部楼层
五行缺五行 发表于 2017-2-16 16:30
最上面加没用,这不代表什么,global要在作用域里面加在局部变量才有用

明白了,我才搞明白python会产生一个与全局变量同名的局部变量。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 15:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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