一尘不染

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

python

这是一个奇怪的行为。

尝试这个 :

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

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

我发现它真的很奇怪,我大多数时候都使用列表,甚至根本不使用global作为全局…


阅读 250

收藏
2020-12-20

共1个答案

一尘不染

它不是自动全局的。

但是,rep_i=1和之间存在区别rep_lst[0]=1-前者重新绑定了name
rep_i,因此global需要使用它来防止创建相同名称的本地插槽。在后一种情况下,您只是在修改现有的全局对象,该对象可以通过常规名称查找找到(更改列表条目就像在列表上调用成员函数一样,而不是重新绑定名称)。

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

2020-12-20