我想知道为什么这不起作用?我对编程相当陌生,我正在学习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()
在 Python 中,函数的参数(定义旁边括号中的内容)作为局部变量添加到代码中的函数范围内。Python 解释器会对您的代码进行一些主要扫描。第一种是语法扫描,它测试你的程序是否根据Python的规则在语法上是正确的。其中一条规则是,对于具有自己作用域的给定代码块,不能同时位于本地命名空间和全局命名空间中的变量。
在此扫描中,它会在运行代码之前为您执行一些特殊检查。它存储所有全局变量和局部变量的名称,并相互检查它们。由于函数的参数必须在函数范围内被视为"局部",因此它们不能在函数定义中声明为"全局",因为这会产生矛盾。
您可以做的是在函数定义之前将x
和y
声明为全局的,这将起作用。
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()
这是因为您尝试覆盖参数 x
,但您不能。这是一个相关的问题
要解决此问题,请不要命名变量。你的代码差不多是:
x = 'hi'
x = 5
print(x)
# Why isn't this 'hi'?
顺便说一下,您的 while 循环将无限期运行。x = int(input("Number: "))
之后,您可能需要添加break
。另一个循环也是如此。
好吧,让我们看看 python3 的 API,以下是全局关键字的描述:
全局语句是保存整个当前代码块的声明。这意味着列出的标识符将被解释为全局标识符。没有全局变量就不可能赋值给全局变量,尽管自由变量可以引用全局变量而不声明全局变量。全局语句中列出的名称不得在该全局语句前面的文本代码块中使用。全局语句中列出的名称不得定义为形式参数,也不得定义为 for 循环控制目标、类定义、函数定义或导入语句中。
全局语句中列出的名称不得定义为正式参数
全局语句中列出的名称不得定义为正式参数
全局语句中列出的名称不得定义为正式参数
因此,您不能将 x 和 y 命名为形式参数和全局参数
所以,如果我是对的,要使用全局变量,变量不能在函数中:fun([HERE])
,相反,括号必须留空!
然后我们必须做global var
,做我们需要做的任何事情!
我在下面得到了同样的错误:
语法错误:名称"num"是参数和全局
当我在test()
中定义num
全局变量时num
参数如下所示:
num = 10
# Here
def test(num):
global num # Here
因此,我从test()
中删除了num
参数,如下所示:
num = 10
# ↓↓ "num" is removed
def test():
global num
或者,我将num
参数重命名为number
参数test()
如下所示:
num = 10
# ↓↓ "num" is renamed to "number"
def test(number):
global num
然后,错误就解决了。