Python 我分配了一个变量,但它说我没有

Python 我分配了一个变量,但它说我没有,python,windows,variable-assignment,python-3.5,unassigned-variable,Python,Windows,Variable Assignment,Python 3.5,Unassigned Variable,注意:我使用的是Python 3.5 我刚开始为我制作的基于文本的游戏制作第二部分,下面是我遇到问题的代码: import random def game(): randomIp = random.randint(10, 999) def tutorial(): global randomIp print('Hello.') print(randomIp + '.' + randomIp + '.' + randomIp +

注意:我使用的是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
中定义,仅用于
打印(randomIp+'.+randomIp+'.+randomIp+'.+randomIp+'.+randomIp)
。有人知道问题出在哪里吗?如果我想在每个
之后打印一个不同的随机数。那代码是什么?我希望它能打印出类似于
23.321.43.23
的内容。每个句点后都有一个完全不同的数字。

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

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

def game():
    randomIp = ...
    def tutorial():
        print(randomIp + ...)
请注意,只有在
tutorial()
内部未分配
randomIp
时,此操作才有效,否则需要
非本地
声明:

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地址做任何事情。

一个“全局”是一个模块级变量。您在封闭范围内定义它,但不是在模块级别;因此,它实际上并不适合您。因为
tutorial()
game()
模块级别内,您不需要使用
global
keyword@RNar:
tutorial()
中没有
randomIp=
<无论
randomIp
tutorial()
实际定义在何处,都不应在其中使用code>global randomIp
。无关:要打印随机IPv4,如果我希望在每个
之后打印不同的随机数,可以使用
print(ipaddress.IPv4Address(random.getrandbits(32))
。那代码是什么?我希望它能打印出像23.321.43.23这样的内容。每个周期后的一个完全不同的数字@DietrichEpp@JohnAntonioAnselmo:那么您需要一个函数。那么我如何用它替换
print(randomIp+'.+randomIp+'.+randomIp+'.+randomIp+'.+randomIp+'.+randomIp)
?。我是否只要在需要时调用
randomIp()
,它就会列出类似32.34.423.34之类的内容@Dietricheppies,它将返回这样一个字符串。它输出一个带单引号的Ip,有没有办法去掉单引号@迪特里切普