LISTL = [] VAR1 = 0 def foo():... VAR1 + = 1 ...返回VAR1 ...
在调用时foo(),我收到此错误:
UnboundLocalError: local variable 'VAR1' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
但是,请考虑清单 LISTL
>>> def foo(x):
... LISTL.append(x)
... return LISTL
...
>>> foo(5)
[5]
Run Code Online (Sandbox Code Playgroud)
这按预期工作.问题是为什么列表中的追加有效,但我无法更改int?
另外,这是在Python中声明全局的正确方法吗?(在导入声明之后)
造成这种差异的原因与Python如何命名名称有关.如果你在函数定义(def foo():)中,并且你访问一个名称(VAR1或LISTL),它将首先搜索你的本地命名空间,它将找不到任何东西,然后它将搜索函数所定义的模块的命名空间,一直到全局命名空间,直到找到匹配或失败.
但是,访问名称和分配名称是两个不同的概念.如果您再次在函数定义中,并且您说VAR1 = 2,您在函数内声明了一个带有新本地名称的新变量VAR1.如果您认为如果在工作中没有这样的命名空间,您会遇到各种命名冲突,这是有道理的.
当您附加到列表时,您只是访问列表,然后在其上调用一个恰好改变其概念值的方法.当你使用do时+=,你实际上是在为一个名字指定一个值.
如果您希望能够为当前命名空间之外定义的名称赋值,则可以使用global关键字.在这种情况下,在您的函数中,您首先会说global VAR1,并且从那里名称VAR1将是外部命名空间中的名称,并且对它的任何赋值将在函数之外生效.
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |