7

我想知道为什么这不起作用?我对编程很陌生,我正在学习 Python。

def convert(x,y):
    while True:
        try:
            global x
            x = int(input("Number: "))
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            global y
            y = int(input("Number: "))
        except ValueError:
            print("Make sure it is a number.")


convert(x,y)

请告诉我如何使这项工作。

此外,我在运行时得到的错误是 name 'x' 是参数和全局的。

好的,我修好了。这是正确的代码。

def convert():
    while True:
        try:
            global number
            number = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            global number2
            number2 = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")


convert()
4

5 回答 5

7

在 Python 中,函数的参数(定义旁边括号中的内容)作为局部变量添加到代码中函数的范围内。Python 解释器会对您的代码进行几次主要扫描。第一个是语法扫描,它会根据 Python 的规则测试您的程序在语法上是否正确。其中一条规则是,对于具有自己范围的给定代码块,您不能拥有同时位于本地命名空间和全局命名空间中的变量。

在此扫描中,它甚至会在运行代码之前为您进行一些特殊检查。它存储所有全局变量和局部变量的名称,并相互检查它们。由于函数的参数必须在函数范围内被视为“局部”,因此它们不能在函数定义中声明为“全局”,因为这会产生矛盾。

你可以做的是在你的函数定义之前声明xy成为全局的,这将起作用。

于 2013-09-15T00:42:10.213 回答
4

Haidro很好地解释了这个问题,这里有一个解决方案!

您似乎想从用户那里读取两个值,并将它们保存到 x 和 y。为此,您可以从函数中返回多个值(python 支持这一点)。

例子:

def convert():
    x = 0
    y = 0
    while True:
        try:
            x = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")
    while True:
        try:
            y = int(input("Number: "))
            break
        except ValueError:
            print("Make sure it is a number.")

    return x, y # magic 

a, b = convert() # you could name these any way you want, even x/y, no collisions anymore

当然,稍微清理一下代码以删除重复的东西会更好:

def readNumber():
    while True:
        try:
             x = int(input("Number: "))
             return x
        except ValueError:
             print("Make sure it is a number!")

# and then
a = readNumber()
b = readNumber()

# or:
def convert():
    return readNumber(), readNumber()
a, b = convert()
于 2013-09-15T00:40:20.380 回答
3

这是因为你试图覆盖参数x,但你不能。这是一个相关的问题

要解决此问题,请不要命名变量。你的代码差不多:

x = 'hi'
x = 5
print(x)
# Why isn't this 'hi'?

顺便说一句,您的 while 循环将无限期地运行。之后x = int(input("Number: ")),您可能需要添加一个break. 另一个循环也一样。

于 2013-09-15T00:32:23.230 回答
1

好了,我们看一下python3的API,下面是全局关键字的说明:

全局语句是适用于整个当前代码块的声明。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。全局语句中列出的名称不得在该全局语句之前的同一代码块中使用。 全局语句中列出的名称不得定义为形式参数或 for 循环控制目标、类定义、函数定义或导入语句。

全局语句中列出的名称不得定义为形式参数

全局语句中列出的名称不得定义为形式参数

全局语句中列出的名称不得定义为形式参数

因此,您不能将 x 和 y 命名为形式参数和全局参数

于 2018-08-14T16:25:42.477 回答
1

所以,如果我是对的,要使用全局变量,变量不能在函数中:fun([HERE])而是括号必须留空

然后我们必须global var做任何我们需要做的事情!

于 2020-03-04T23:28:07.383 回答