【问题标题】:I Assigned a Variable but it Says I Did Not我分配了一个变量,但它说我没有
【发布时间】:2016-02-14 10:11:13
【问题描述】:

注意:我使用的是 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(),并且在命令global randomIP 中没有为print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp) 定义randomIp 并没有错误。有谁知道问题是什么?如果我想在每个"." 之后打印一个不同的随机数。代码是什么?我想要它,这样它就可以打印出类似23.321.43.23 的东西。每个周期后的数字完全不同。

【问题讨论】:

  • “全局”是模块级变量。您在封闭范围内定义它,但不是模块级别;因此,它不是对你来说实际上是一个全球性的。
  • 因为tutorial()在你的game()模块级别,你不需要使用global关键字
  • @RNar: tutorial() 里面没有randomIp=。无论randomIp 或tutorial() 实际定义在哪里,都不应在其中使用global randomIp。
  • 不相关:要打印随机 IPv4,您可以使用 print(ipaddress.IPv4Address(random.getrandbits(32)))

标签: python windows variable-assignment python-3.5 unassigned-variable


【解决方案1】:

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

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

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

请注意,这仅在您没有在tutorial() 中分配 randomIp 时才有效,否则您将需要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 地址用于任何事情。

【讨论】:

  • 如果我想在每个"." 之后打印一个不同的随机数。代码是什么?我想要它,以便它打印出类似 23.321.43.23 的内容。每个时期后一个完全不同的数字@DietrichEpp
  • @JohnAntonioAnselmo:那么你需要一个函数。
  • 那么我该如何替换 print(randomIp + '.' + randomIp + '.' + randomIp + '.' + randomIp) 呢?我是不是只要我需要的时候就打电话给randomIp(),它会列出像32.34.423.34这样的东西,或者类似的东西? @DietrichEpp
  • 是的,它会返回一个这样的字符串。
  • 它输出一个带单引号的IP,有什么办法可以去掉单引号? @DietrichEpp
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 2021-04-22
  • 2022-01-10
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多