在Python中,为什么list []会自动全局?

Phy*_*win 9 python global list python-2.7

这是一种奇怪的行为.

试试这个 :

rep_i=0
print "rep_i is" , rep_i
def test():
  global rep_i #without Global this gives error but list , dict , and others dont
  if rep_i==0:
    print "Testing Integer %s" % rep_i
    rep_i=1
  return "Done"

rep_lst=[1,2,3]


def test2():
  if rep_lst[0]==1:
    print "Testing List %s" % rep_lst
  return "Done"


if __name__=="__main__":
  test()
  test2()
Run Code Online (Sandbox Code Playgroud)

为什么列表不需要声明全局?他们是自动全球的?

我发现它真的很奇怪,我大部分时间都使用列表,我甚至根本不使用全球它们作为全球.....

Ale*_*ler 13

它不是自动全局的.

但是,rep_i=1和之间存在差异rep_lst[0]=1- 前者重新命名rep_i,因此global需要阻止创建同名的本地插槽.在后一种情况下,您只是修改现有的全局对象,它通过常规名称查找找到(更改列表条目就像调用列表中的成员函数一样,它不是名称重新绑定).

为了测试它,尝试分配rep_lst=[]test2(也就是将其设置为一个新的列表).除非您声明rep_lst global,否则效果将不会在外部显示,test2因为创建了同名的本地插槽并隐藏了全局插槽.


Dav*_*nan 5

只有global在分配全局名称时才需要使用.没有global,作业会创建一个新的本地.

关于如何global应用于列表没有什么特别之处 - global只是影响范围和名称解析.


let*_*bee 5

python中有一个错误调用UnboundLocalError,经常让新手感到困惑。令人困惑的是:未来的赋值确实改变了查找变量的方式。

当解释器第一次看到一个变量名时,它会向前看当前代码块的末尾,如果你在同一代码块中的任何地方都没有对其进行赋值,解释器会认为它是全局的。但是,如果这样做,则它被视为本地的,并且在赋值之前对它的任何引用都会生成一个UnboundLocalError. 这就是你得到的错误。这就是为什么你需要声明global rep_i. 如果您没有分配rep_i,则不需要此行。

此外,这与变量类型无关。此外,将项目分配或附加到列表(您可能打算这样做,但没有)不是列表本身的分配,它本质上是在列表对象上调用一个方法,这与分配不同:分配创建一个新对象(可能使用已经存在的名称),而操作列表只会更改现有列表。你可以试试:

In [1]: # It won't work with small integers, as they are cached singletons in CPython

In [2]: a = 123123

In [3]: id (a)
Out[3]: 9116848

In [4]: a = 123123

In [5]: id(a)
Out[5]: 9116740

In [6]: # See, it changed

In [7]: # Now with lists

In [8]: l = [1,2,3]

In [9]: id(l)
Out[9]: 19885792

In [10]: l[1] = 2

In [11]: id(l)
Out[11]: 19885792

In [12]: # See, it is the same

In [13]: # But if i reassign the list, even to the same value

In [14]: l = [2,2,3]

In [15]: id(l)
Out[15]: 19884272
Run Code Online (Sandbox Code Playgroud)