在Python,为什么名单[]自动全球?在Python,为什么名单[]自动全球?(In Python

2019-05-12 05:25发布

这是一个奇怪的行为。

试试这个 :

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()

为什么名单并不需要声明全局? 他们是自动全球?

我觉得很奇怪,我用清单的大部分时间,我甚至不使用全球都对我们这些全球.....

Answer 1:

它是不会自动全球。

然而,有之间的差异rep_i=1rep_lst[0]=1 -前重新绑定名称rep_i ,因此global需要防止同一名称的一个局部槽的创建。 在后一种情况下,你只是修改现有的,全局对象,这是由正规名称查找发现(更改列表条目就像调用列表中的成员函数,它不是一个名称重新绑定)。

对其进行测试,试分配rep_lst=[]test2 (即,其设置为一个新的列表)。 除非你声明rep_lst global ,其影响将是不可见的外test2 ,因为在创建同名的本地插槽和阴影全球插槽。



Answer 2:

你只需要使用global如果你是分配给全局名称。 如果没有global ,分配创建一个新的地方。

没有什么特别的关于如何global适用于列表- global只是影响的范围和名称解析。



Answer 3:

在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


Answer 4:

如果您分配了一个新的价值rep_lst的内部test2 (不只是它的元素之一,像你一样),它不会不工作的global标志。 在Python中,如果你不分配给一个功能它会查找该变量在更全局范围,直到找到它里面的变量。

例如,在此代码段I定义全球和内部列表example() 。 由于在可变example()是在范围接近example2()比全局之一是,它是什么将被使用。

x = ["out"]

def example():
    x = ["in"]
    def example2():
        print x # will print ["in"]

这有没有关系名单,但在Python任何变量的行为。



Answer 5:

下面是一个证明非一个例子list / dict变量可在一个子程序,而问题是,大家都认为,行为rebinding你原来的代码示例:

x = 1
def test():
    y = x + 1
    print y
test()

你会看到这样打印出2 ,尽管x未声明的全局。



文章来源: In Python, why is list[] automatically global?