2

我正在为学校练习制作一个串行密钥生成器,但遇到了一个小问题。当我运行程序并输入我想制作 20 个串行密钥时,程序将制作 20 个相同的密钥。造成这种情况的原因是 for 循环每次经过时都会生成变量。(v{0} 的事情)

我不知道如何使用另一种方法来读取列表中的所有值,并从中创建变量。

我的代码:

import random, sys

class Application:

    def __init__(self):
        global i
        i = int(input("How many serial codes do you want to create?\n"))
        print("")
        self.main(i)


    def main(self, i):

        seq = "ABCDFGHJIKLMNOPQRSTUVWXYZ1234567890"
        store = []

        for z in range(0, i):  
            for x in range(0, 5):
                first = random.choice(seq)
                second= random.choice(seq)
                third = random.choice(seq)
                fourth =random.choice(seq)
                fifth = random.choice(seq)
                serial = first + second + third + fourth + fifth
                store.append(serial)

            for y, item in enumerate(store):
                setattr(sys.modules[__name__], 'v{0}'.format(y), item)

            create = v0 + "-" + v1 + "-" + v2 + "-" + v3 + "-" + v4
            print(create)
        print("\nCreated", i, "serial keys!")

if __name__ == '__main__':
    app = Application()
4

2 回答 2

5

你在那里做一些非常时髦的东西,完全没有必要。

这个循环是你的问题:

for y, item in enumerate(store):
    setattr(sys.modules[__name__], 'v{0}'.format(y), item)

您一遍又一遍地设置相同的 5 个全局变量,覆盖以前的版本。当您拥有将全局命名空间作为字典提供setattr(sys.modules[__name__], ..)的功能时,您完全不需要使用。globals()但是设置全局变量来解决一个简单的问题就像用霰弹枪捉虫一样。

您的代码可以大大简化:

def main(self, count):
    seq = "ABCDFGHJIKLMNOPQRSTUVWXYZ1234567890"

    for i in range(count):
        print('-'.join(''.join(random.choice(seq) for _ in range(5)) for _ in range(5)))

    print("\nCreated {} serial keys!".format(count))

count设置为 5的示例打印输出:

LWLGX-F6MNR-9YIZC-H23TK-TIGB9
YALYY-4ZARO-8H9BV-YMHVD-HFFGP
JNA5R-65GT1-TZ3BM-PNMZI-56NM3
39VCY-MLZ98-SU1PP-PYMX7-RZJQZ
76LGC-VF5MG-LK7C4-XPUSO-H0B97
于 2013-06-11T16:45:35.927 回答
1

您可能会发现在最后打印 store 以用于调试目的很有用。您不断地追加到列表中,但只读取前五个元素。

全局变量的使用对我来说有点奇怪,但根本问题是你使用列表的方式。

于 2013-06-11T16:56:58.230 回答