尝试打印随机字符串时的回溯

Traceback when trying to print a random string

我还是个初学者,所以我可能遗漏了一些明显的东西。 我正在尝试使用随机符号、字母和数字生成密码,并且应该只使用我们已经学过的功能(所以没有高级的东西)。

这是有问题的代码:

l=[]
s=[]
numb=[]

for letter in range (0,(nr_letters)):
  l.append(random.choice(letters))
for symbol in range(0,(nr_symbols)):
  s.append(random.choice(symbols))
for numbers in range(0,(nr_numbers)):
  numb.append(random.choice(numbers))

(信息:“nr_letters”(以及“nr_symbols”等)是用户给我们的输入,而“letters”是字符串列表。)

“for”函数可以很好地处理字母和符号,但我收到“数字”的回溯,即使数字列表也是由字符串组成的。 这是回溯:

Traceback (most recent call last):
  File "main.py", line 27, in <module>
    numb.append(random.choice(numbers))
  File "/usr/lib/python3.8/random.py", line 288, in choice
    i = self._randbelow(len(seq))
TypeError: object of type 'int' has no len()

我试图再次告诉python,我的数字列表中没有积分,所以我写了

numb.append(random.choice(str(numbers)))

但是,虽然 Python 现在出于某种原因理解该列表中的项目是字符串,但它现在似乎忽略了“random.choice”位,因为它按顺序打印数字,开始从 0.

我在这里做错了什么?并且请不要对其余代码进行更正,因为我确实想尝试主要由我自己完成该项目,否则我将学不到任何东西。我只是不明白为什么 python 没有按照我认为我在这里告诉它做的去做。 感谢任何帮助!

你的逻辑没问题,只是你犯的错误是将相同的数字列表命名为 for 循环中迭代器的局部变量

   for **numbers** in range(0,(nr_numbers)):
      numb.append(random.choice(*numbers*))

最简单的解决方案就是更改 for 循环中的变量名,因为无论如何您都不会使用它。示例:

for i in range(0,(nr_numbers)):
  numb.append(random.choice(numbers))

编辑

稍微说明一下。在您的示例中,每次调用 numb.append 时,它都会尝试从局部变量编号而不是全局变量编号中获取 random.choice 。如果您还不知道什么是局部变量和全局变量,Here 可以帮助您理解 link。