为了账号安全,请及时绑定邮箱和手机立即绑定

如何在变量已经定义之后更改它?

如何在变量已经定义之后更改它?

鸿蒙传说 2019-07-04 17:50:16
如何在变量已经定义之后更改它?我试图从一个定义的变量中添加或减去一个变量,但是我不知道如何用新的变量覆盖旧的值。a = 15def test():     a = a +10     print ( a )test()错误信息:Traceback (most recent call last):   File "test.py", line 7, in <module>     test()   File "test.py", line 4, in test     a = a +10 UnboundLocalError: local variable 'a' referenced before assignment
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

当您尝试运行代码时会遇到以下错误:

UnboundLocalError: local variable 'a' referenced before assignment

…从表面上看,这似乎很奇怪:毕竟,第一代码中的语句(a = 15)是一项任务。那么,怎么回事?

事实上,有两个不同的事情正在发生,它们都不是显而易见的,除非你已经知道它们。

首先,实际上有两个不同的变量:

  • 这个a第一行是一个全局变量(之所以被称为全局变量,是因为它存在于任何函数定义之外的全局范围中)。

  • 这个a在其他行中是一个局部变量,这意味着它只存在于test()功能。

这两个变量是完全不相关的,尽管它们的名字是相同的。

如果在函数中有一个分配给它的语句,那么变量就是函数的本地变量-例如,a = a +10排队。

即使如此,这个错误看起来还是很奇怪的-毕竟,你在里面做的第一件事就是test()是分配给a那么它怎么能事先被引用呢?

答案是,在赋值语句中,Python计算=在将其分配给左手边的名称之前先签名-因此,即使任务是写成在你的代码中,a获得参考首先在右边:a +10.

有两种方法可以避免这种情况。第一种方法是告诉Python您真的希望atest()是一样的a在全球范围内:

def test():
    global a
    a = a + 10
    print(a)

这是可行的,但这是一个非常糟糕的方式来编写程序。更改函数内部的全局变量变得非常困难,因为您通常有很多函数,而且没有一个函数能够确保另一个函数不会以他们所不期望的方式干扰全局变量。

更好的方法是将变量作为参数传递给函数,如下所示:

a = 15def test(x):
    x = x + 10
    print(x)test(a)

注意,名称不一定是相同的-您的新定义test()只是说它接受一个值,然后用它做一些事情。你可以随心所欲地传递你想要的东西-可能是a,或数字7或者别的什么。实际上,如果您试图避免在不同的作用域中使用同名变量,您的代码就会更容易理解。

如果您使用上面的代码,您会注意到一些有趣的东西:

>>> a = 15>>> test(a)25>>> a15

… a没有改变!那是因为尽管你把它传给了test()它被分配给x,就在那时x它被改变了,留下了原来的a独自一人。

如果你真的想改变a,您需要返回修改过的x,然后将其重新分配到a在外面:

>>> a = 15

>>> 

>>> def test(x):

...     x = x + 10

...     print(x)

...     return x

... 

>>> a = test(a)

25

>>> a

25


查看完整回答
反对 回复 2019-07-04
?
函数式编程

TA贡献1807条经验 获得超9个赞

你在修改一个变量a在函数范围内创建的test()..如果你想要外来者a要进行修改,您可以这样做:

a = 15def test():
    global a
    a = a + 1
    print(a)test()


查看完整回答
反对 回复 2019-07-04
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我会这样做:

def test(a):
    a = a +10
    return aprint(test(15))

请注意,在这里提出的版本中有一些与你的不同之处。

首先,我写下的是创建一个函数,作为输入,它的值a(在本例中,当我们调用函数时-在最后一行中已经定义了-),然后分配给对象。a价值a(15)加上10,然后返回a(经过修改,现在是25),最后,打印a感谢最后一行代码:

print(test(15))

请注意,可以说,您所做的并不是一个纯粹的函数。通常,我们希望函数获得一个输入值(或多个)并返回一个输入值(或多个)。在您的例子中,您的输入值实际上是空的,并且没有输出值(因为您没有使用回归)。另外,你试着写这个输入a在函数的外部(当您通过以下方式调用它时)test(a)价值a没有加载给您的错误-即在计算机的眼里,它是“空的”)。

此外,我鼓励你习惯于写作。回归在函数中,然后在调用它时使用打印(就像我在最后一个编码行中所写的那样:print(test(15)))而不是在函数中使用它。最好只在调用该函数并希望查看该函数实际正在执行的操作时才使用print。

至少,这是他们在基本编程课程中向我展示的方式。这可以如下所示:如果您在函数中使用返回,则该函数将为您提供一个以后可用于其他函数(即函数)中的值。回归这是你可以处理的事情)。否则,只会在屏幕上显示一个数字,列印,但计算机无法进一步使用它。

你也可以这么做:

def test(a):
    a +=10      
    return aprint(test(15))


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 591 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信