Python中的“名称'x'是参数和全局”错误

yb3bgrhw  于 2022-11-28  发布在  Python
关注(0)|答案(6)|浏览(250)

我想知道为什么这不起作用?我对编程相当陌生,我正在学习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()
exdqitrt

exdqitrt1#

Python中函数的参数(定义旁边的括号中的内容)作为局部变量添加到代码中的函数作用域。Python解释器对代码进行几次主要扫描。第一次是语法扫描,它根据Python的规则测试程序的语法是否正确。其中一条规则是,对于给定的具有自己作用域的代码块,您不能同时拥有本地名称空间和全局名称空间中的变量。
在这个扫描中,它会在运行代码之前为你做一些特殊的检查。它会存储所有全局变量和局部变量的名称,并相互检查。由于函数的参数在函数的作用域中必须被认为是“局部”的,所以它们不能在函数定义中声明为“全局”,因为这会产生矛盾。
你可以在函数定义之前声明xy是全局的,这样就可以了。

sc4hvdpw

sc4hvdpw2#

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

qni6mghb3#

这是因为你试图覆盖参数x,但是你不能。Here's a related question
要解决这个问题,不要命名变量。您的代码基本上是:

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

顺便说一下,while循环将无限期地运行,在x = int(input("Number: "))之后,你可能需要添加一个break,其他循环也是如此。

biswetbf

biswetbf4#

好了,让我们看看python3的API,这里是全局关键字的描述:
global语句是对整个当前代码块的声明。它意味着列出的标识符将被解释为全局变量。如果没有global,但自由变量可以引用全局变量而不声明为全局变量。全局语句中列出的名称不得用于该全局语句前面的同一代码块中。全局语句中列出的名称不得定义为形参,也不得在for循环控制目标、类定义、函数定义或import语句中定义。

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

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

rvpgvaaj

rvpgvaaj5#

所以,如果我是对的,要使用global,变量必须不在函数中:fun([HERE]),而方括号必须为空
然后我们必须做global var,做任何我们需要做的!

jqjz2hbq

jqjz2hbq6#

我得到了下面相同的错误:
语法错误:name 'num'是参数,而且是全局的
当我在具有**num参数test()中定义num全局变量**时,如下所示:

num = 10
        # Here
def test(num):
    global num # Here

因此,我从test()中删除了**num参数**,如下所示:

num = 10
      # ↓↓ "num" is removed
def test():
    global num

或者,我将test()中的**num参数重命名为number参数**,如下所示:

num = 10
         # ↓↓ "num" is renamed to "number"
def test(number):
    global num

然后,错误得到解决。

相关问题