python – 导入模块时无法看到全局变量的更改

weixin_38080567 2019-09-12 12:22:09
我想实现与第三版CLRS的问题2-4相关的python代码.问题是“在列表中查找反转的数量”,第41页,我编写了这段代码: mainCounter = 0 def merg(array,counter): if len(array)==1: return array left = array[:len(array)/2] right = array[len(array)/2:] return combine(merg(left, counter), merg(right, counter), counter) def combine(array1, array2, counter): global mainCounter result = [] pointer1 = 0 pointer2 = 0 while(pointer1 != len(array1) and pointer2 != len(array2)): if array1[pointer1] < array2[pointer2]: result.append(array1[pointer1]) pointer1 += 1 elif array1[pointer1] == array2[pointer2]: result.append(array1[pointer1]) pointer1 += 1 else: result.append(array2[pointer2]) counter += (len(array1)-pointer1) pointer2 += 1 if pointer1 == len(array1): for i in array2[pointer2:]: result.append(i) else: for i in array1[pointer1:]: result.append(i) mainCounter+=counter return result 问题是当我在python控制台中导入这个模块时,mainCounter没有改变但是必须改变!!: Python 2.7.3 (default, Aug 1 2012, 05:16:07) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from mergSort import * >>> merg([1,4,2,3],0) 0 0 2 [1, 2, 3, 4] >>> merg([1,4,2,3],0) 2 2 4 [1, 2, 3, 4] >>> mainCounter 0 >>> merg([1,4,2,3],0) 4 4 6 [1, 2, 3, 4] >>> merg([1,4,2,3],0) 6 6 8 [1, 2, 3, 4] >>> merg([1,4,2,3],0) 8 8 10 [1, 2, 3, 4] >>> mainCounter 0 每当我调用merg函数时,我会得到不同的结果,但mainCounter没有改变!哪里错了?
...全文
71 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38088844 2019-09-12
  • 打赏
  • 举报
回复
tldr:不要使用模块导入* import *没有您想象的那么特别 – 当您从mergSort import *导入东西时,请将其视为 import mergSort mainCounter = mergSort.mainCounter merg = mergSort.merg del mergSort 所以你真的只是引用了当你进行导入时mergSort.mainCounter引用的int对象. mergSort使用mergSort.mainCounter一个;以同样的方式 >>> a = 1 >>> b = a >>> a += 1 # or a = a + 1 or a = a.__add__(1) >>> a 2 >>> b 1 我们对整数对象有两个单独的引用,并且递增一个(将引用更改为指向由旧对象上的方法调用生成的新对象)将不会影响另一个.要确认这一点,请尝试 merg.__globals__['mainCounter'] 要么 import sys; sys.modules[merg.__module__].mainCounter 这些应该具有merg正在使用的mainCounter值. (sys.modules [‘mergSort’]是merg .__ globals__是真的,它们是同一个字典) 当一个名称在函数中声明为全局时,它将在函数模块的命名空间中查找. import *经常受到诽谤,因为它很难追踪名称的来源,但是这里也很糟糕,因为它打破了我们对模块的概念 – 只是因为你从模块导入*并不意味着你实际上在命名空间,你刚刚从模块导入a,b,c,d,e,….这样做会变得更糟,因为许多名称在Python中没有重新绑定,但有些名称一直都是,就像名字一样通过引用整数作为计数器.

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧