导入modu时看不到全局变量的变化

2024-09-26 22:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实现第三版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函数时,我得到的结果都不同,但是主计数器没有改变!我哪里错了?在


Tags: 代码lenreturnifdefcounterresultarray
2条回答

最好不要使用import *。 导入的对象彼此不了解任何信息,使用global mainCounter也无济于事。在

试试这个:

import mergSort

mergSort.merg([1, 4, 2, 3], 0)
print mergSort.mainCounter

tldr:不要使用from module import *

import *没有你想象的那么特别——当你用from mergSort import *导入东西时,把它想象成

import mergSort
mainCounter = mergSort.mainCounter
merg = mergSort.merg
del mergSort

所以您实际上只有一个对int对象的引用,mergSort.mainCounter在导入时引用了它。mergSort使用mergSort.mainCounter一;方法与

^{pr2}$

我们有两个对整数对象的独立引用,递增一个(将引用更改为指向由对旧对象的方法调用生成的新对象)不会影响另一个。要确认这一点,请尝试

merg.__globals__['mainCounter']

或者

import sys; sys.modules[merg.__module__].mainCounter

这些应该具有merg正在使用的主计数器值。在

sys.modules['mergSort'] is merg.__globals__是真的,它们是同一个东西字典)

当一个名称在函数中被声明为全局时,它将在函数的模块名称空间中查找。在

import *经常被人诟病,因为它使跟踪名称的来源变得非常困难,但在这里它也很糟糕,因为它打破了我们对模块的概念-仅仅因为从模块导入*并不意味着您实际上在它的名称空间中,您刚刚完成了from module import a, b, c, d, e, ...。这种情况更糟,因为许多名称在Python中没有太多的重新绑定,但是有些名称总是绑定的,就像名称通过引用整数充当计数器一样。在

相关问题 更多 >

    热门问题