从测试文件访问全局变量

Jam*_*sev 0 python

我有一个包含2个全局变量的文件A.

root = ""
crumbs = []


def read(line):
    global root, crumbs

    line = line.strip()
    open_tag = is_valid_open(line)
    kv = get_kv(line)

    if open_tag is not None:
        root += open_tag + "."
        print root                      <---------- prints stuff

    elif kv is not None:
        crumbs.append(kv[0] + "=" + kv[1])
        print crumbs                   <---------- prints stuff
Run Code Online (Sandbox Code Playgroud)

我有一个测试我

from A import read, root, crumbs
Run Code Online (Sandbox Code Playgroud)

我喂它一些数据

    read('<a>')
    read('<b>')
    read('<d>acceptor</d>')
Run Code Online (Sandbox Code Playgroud)

并打印结果

    print "." + root + "."             <---------- prints NOTHING
    print "." + str(crumbs) + "."      <---------- prints stuff
Run Code Online (Sandbox Code Playgroud)

为什么我可以访问列表但不能访问测试文件中的String?似乎如果一个人工作,其他人也应该工作.

kin*_*all 5

简而言之,这是因为+=列表和字符串做了不同的事情.

  • 字符串是不可变的.因此,root += ...A.py中创建一个新字符串并将其分配给root.有两个引用root:一个在A.py中,一个在测试脚本中.该root +=行仅rootA.py中更改,因为这是A.py中的函数唯一可以访问的行.该root测试模块中没有改变.

  • 列表是可变的.因此,crumbs +=修改现有列表,并且不会更改crumbs指向的内容.由于crumbs仍然在A.py和测试模块中引用相同的列表,因此您可以看到测试模块中的更改.

如果你写这些语句,没有它变得更加清晰+=:

  • root = root + ...显然,新的字符串和更改root指向它
  • crumbs.extend(...)显然没有新的列表,也没有改变crumbs指向的内容

当您尝试在不使用完全限定名称的情况下访问模块之间的变量时,可能会出现这种混淆.最终会有多个名称,这些名称最初(跟随import)引用同一个对象,但稍后会有一些更改.

该解决方案是只是为了import A和参考A.root,并A.crumbs在您的测试脚本.这样,这些对象只有一个规范名称,名称由更改它们的模块"拥有".