我想实现第三版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没有改变,但是必须改变!!公司名称:
^{pr2}$每次我调用merg
函数时,我得到的结果都不同,但是主计数器没有改变!我哪里错了?在
最好不要使用
import *
。 导入的对象彼此不了解任何信息,使用global mainCounter
也无济于事。在试试这个:
tldr:不要使用
from module import *
import *
没有你想象的那么特别——当你用from mergSort import *
导入东西时,把它想象成所以您实际上只有一个对int对象的引用,
^{pr2}$mergSort.mainCounter
在导入时引用了它。mergSort
使用mergSort.mainCounter
一;方法与我们有两个对整数对象的独立引用,递增一个(将引用更改为指向由对旧对象的方法调用生成的新对象)不会影响另一个。要确认这一点,请尝试
或者
这些应该具有merg正在使用的主计数器值。在
(
sys.modules['mergSort'] is merg.__globals__
是真的,它们是同一个东西字典)当一个名称在函数中被声明为全局时,它将在函数的模块名称空间中查找。在
import *
经常被人诟病,因为它使跟踪名称的来源变得非常困难,但在这里它也很糟糕,因为它打破了我们对模块的概念-仅仅因为从模块导入*并不意味着您实际上在它的名称空间中,您刚刚完成了from module import a, b, c, d, e, ...
。这种情况更糟,因为许多名称在Python中没有太多的重新绑定,但是有些名称总是绑定的,就像名称通过引用整数充当计数器一样。在相关问题 更多 >
编程相关推荐