姓名' x'是参数和全局[Python]

时间:2013-09-15 00:29:37

标签: python

我想知道为什么这不起作用?我对编程很新,我正在学习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)

请告诉我如何完成这项工作。

此外,我运行此错误时得到的错误是名称'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()

5 个答案:

答案 0 :(得分:3)

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

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

您可以做的是在您的函数定义之前声明xy是全局的,并且这样做。

答案 1 :(得分:1)

这是因为你试图覆盖参数x,但你不能。 Here's a related question

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

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

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

答案 2 :(得分:1)

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()

答案 3 :(得分:1)

因此,如果我是对的,请使用全局变量,该变量一定不能位于函数fun([HERE])中,而必须将括号保留为

然后我们必须做global var并做我们需要做的一切!

答案 4 :(得分:0)

好吧,让我们看一下python3的API,这是全局关键字的描述:

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

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

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

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

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