注意:我使用的是Python 3.5
我刚刚开始为自己制作的基于文本的游戏创建第二部分,这是我遇到麻烦的代码:

import random

def game():
    randomIp = random.randint(10, 999)

    def tutorial():
        global randomIp

        print('Hello.')
        print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp)


不断出现的问题是:

File "C:\Users\Anony\Desktop\SICCr4k2BrokeFold\SICCr4k2Broke.py", line 18, in tutorial
  print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp)
NameError: name 'randomIp' is not defined


我不知道怎么了我已将全局变量放入tutorial(),并且没有错误,仅在randomIp命令中未定义global randomIP。有人知道问题出在哪里吗?如果我想在每个print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp)之后打印一个不同的随机数。代码将是什么呢?我希望它可以打印出"."之类的内容。每个周期后的数字完全不同。

最佳答案

您创建了一个局部变量,但是随后尝试访问同名的全局变量。

您可以简单地省略global关键字。

def game():
    randomIp = ...
    def tutorial():
        print(randomIp + ...)


请注意,这仅在未在randomIp中分配tutorial()的情况下才有效,否则您将需要nonlocal声明:

def game():
    randomIp = ...
    def tutorial():
        nonlocal randomIp
        randomIp += 5 # counts as assignment
        print(randomIp + ...)


另请注意,在使用字符串时,在python中使用.format()而不是+更为典型。

# This works
print('{0}.{0}.{0}.{0}'.format(randomIp))

# This does not work
# print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp)


这是因为您无法在Python中向字符串添加整数。在某些其他语言中,这将导致自动转换。在Python中,这只会导致错误。

生成随机IP

这将从有效的/ 8块中生成一个随机IP地址,跳过127 localhost块,多播块等。根据网络掩码,它可能会生成作为广播地址的地址。

def randomIp():
    x = random.randint(1, 222)
    if x == 127:
        x += 1
    return '{}.{}.{}.{}'.format(
        x,
        random.randint(0, 255),
        random.randint(0, 255),
        random.randint(0, 255))


当然,您实际上不应该将IP地址用于任何用途。

10-04 20:20