全局范围因数据类型而异

时间:2014-04-01 18:45:09

标签: python

我有两个全局变量,一个是int,另一个是列表。 我可以在其中一个函数定义中修改列表,但不能修改int(不使用全局语句)。

i = 2000
lst = range(0,3)

def AddM():   
  i=i+1 
  lst.append(10)

这背后的原因是什么?

2 个答案:

答案 0 :(得分:0)

答案比你想象的要简单得多。

  1. 在您的AddM()函数中,您实际创建了一个" new"变量叫做" i"在函数的本地命名空间内,这是函数中所有新签名的默认命名空间。
  2. 当地"我"已被赋予"全球"的价值。 i(您之前在全局命名空间中的函数之外定义),加上一个。
  3. 然后你退出了你的职能,并且"什么都没发生"对全球"我"。 我会认为你就是这里想的。
  4. 您需要在此处学习如何使用全局声明。 请参阅文档并仔细阅读:

    globals()是一个包含所有全局变量的字典: https://docs.python.org/2/library/functions.html#globals

    使用"全球" Python中的关键字: https://docs.python.org/2/reference/simple_stmts.html#the-global-statement

    我通过谷歌发现了一个随机的例子来说明如何修复你的程序: stereochro.me/ideas/global-in-python

    玩得开心。

答案 1 :(得分:0)

正如python doc明确提到的那样

This is because when you make an assignment to a variable in a scope, that variable becomes local to that scope and shadows any similarly named variable in the outer scope.

将该变量的范围定义为全局。

>>> i = 2000
>>> def AddM():
...     global i
...     x += 1
>>> p = AddM()
>>>print p
2001

全局只会影响范围和名称解析。在这里使用列表,您只需修改已存在的列表并附加新元素,这就是您不需要将其定义为全局的原因。