在Python中已经定义的variables之后如何更改variables

我想添加或减去一个定义的variables,但我不知道如何覆盖旧的值与新的。

a = 15 def 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 

您尝试运行代码时遇到的错误是:

 UnboundLocalError: local variable 'a' referenced before assignment 

……表面上看起来很奇怪:毕竟上面的代码( a = 15 )中的第一个语句是一个任务。 发生什么了?

实际上,发生了两件不同的事情,除非你已经知道它们,否则它们都不明显。

首先,你实际上有两个不同的variables:

  • 你的第一行中的a是一个全局variables(所谓的,因为它存在于全局范围内,在任何函数定义之外)。

  • 其他行中的a是局部variables,这意味着它只存在于test()函数中。

这两个variables是完全无关的,尽pipe它们有相同的名字。

如果在函数中有一个语句赋值,那么一个variables对于一个函数是本地的 – 例如,你的a = a +10行。

即使如此,这个错误仍然看起来很奇怪 – 毕竟,你在test()里面做的第一件事是赋值给a ,那么怎么可以事先引用呢?

答案是,在一个赋值语句中,Python在赋值给左边的名称之前,会对=号右边的所有内容进行求值,所以即使赋值先写入代码中,在那个右边: a +10

有两种方法可以解决这个问题。 首先是告诉Python你真的想要a内部test()在全局范围内是一样a

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

这会起作用,但是编写程序是一个非常糟糕的方式。 改变函数内部的全局variables很难快速pipe理,因为你通常有很多函数,而且没有人能够确定另一个函数不会以某种他们不期望的方式搞乱全局variables。

更好的方法是将variables作为parameter passing给函数,如下所示:

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

注意这个名字不一定是相同的 – 你新定义的test()只是说它接受一个值,然后用它做一些事情。 你可以通过任何你喜欢的东西 – 它可以是a ,或者数字7 ,或者其他的东西。 事实上,如果您试图避免在不同范围内使用相同名称的variables,您的代码将会更容易理解。

如果你玩上面的代码,你会注意到一些有趣的事情:

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

a没有改变! 那是因为虽然你把它传递给了test()并把它赋值给了x ,但是那时x被修改了,只剩下原来的a

如果你想实际改变a ,你需要从函数中返回修改的x ,然后重新将它重新分配给外部:

 >>> a = 15 >>> >>> def test(x): ... x = x + 10 ... print(x) ... return x ... >>> a = test(a) 25 >>> a 25 

我会这样做:

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

请注意,在这里提出的版本有一些不同于你的东西。

首先,我写下的内容会创build一个函数,该函数的值为a (在我们调用函数-already在最后一行中定义的情况下,设置为15),然后为该对象分配一个一个 (这是15)加10,然后返回一个 (已经被修改,现在是25),最后,打印出来的感谢最后一行代码:

 print(test(15)) 

请注意,你所做的并不是纯粹的function,可以这么说。 通常我们想要函数获得一个input值(或几个)并返回一个input值(或几个)。 在你的情况下,你有一个实际上是空的input值,没有输出值(因为你没有使用返回 )。 另外,你试图把这个input写到一个函数外面(当你通过test(a)调用它的时候, a没有加载,给了你一个错误 – 在计算机里它是空的) 。

此外,我鼓励你习惯于在函数中写返回 ,然后在你调用它时使用一个打印(就像我在最后一个编码行中写的: print(test(15)) ),而不是在函数内部使用它。 只有当你调用这个函数并且想要看看这个函数实际上在做什么的时候才使用print。

至less,这是他们在基础编程课程中向我展示的方式。 这可以certificate如下:如果你正在函数中使用返回值,函数会给你一个值,稍后可以在其他函数中使用(即函数返回你可以使用的东西)。 否则,您只能在屏幕上显示一个打印号码,但是电脑无法继续使用。

PS你可以这样做:

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

您正在修改在函数test()的范围内创build的variables。 如果你想让外部的a被修改,你可以这样做:

 a = 15 def test(): global a a = a + 1 print(a) test() 
 # All the mumbo jumbo aside, here is an experiment # to illustrate why this is something useful # in the language of Python: a = 15 # This could be read-only, should check docs def test_1(): b = a + 10 # It is perfectly ok to use 'a' print(b) def test_2(): a = a + 10 # Refrain from attempting to change 'a' print(a) test_1() # No error test_2() # UnboundLocalError: ... 

你的错误与已经定义的无关……一个variables只在其所谓的范围内有效:如果你在一个函数中创build一个variables,它只能在这个函数中定义。

 def test(): x=17 print(x) # returns 17 test() print(x) # results in an error.