从测试fi访问全局变量

2024-04-25 18:15:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两个全局变量的文件

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

我有个测试

from A import read, root, crumbs

我给它一些数据

    read('<a>')
    read('<b>')
    read('<d>acceptor</d>')

并打印结果

    print "." + root + "."             <---------- prints NOTHING
    print "." + str(crumbs) + "."      <---------- prints stuff

为什么我可以访问列表而不能访问测试文件中的字符串?似乎如果一个有效,另一个也应该有效


Tags: 文件nonereadistaglinenotroot
1条回答
网友
1楼 · 发布于 2024-04-25 18:15:10

简而言之,这是因为+=对列表和字符串执行不同的操作

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

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

如果您在编写这些语句时不使用+=,则会更清楚:

  • root = root + ...显然创建了一个新字符串,并将root更改为指向它
  • crumbs.extend(...)显然,不会创建新列表,也不会更改crumbs指向的内容

当您尝试在模块之间访问变量而不使用完全限定名时,可能会出现这种小混乱。最终会有多个名称最初(在import之后)引用同一个对象,但后来发生了一些变化

解决方法就是import A并在测试脚本中引用A.rootA.crumbs。这样,这些对象只有一个规范名称,并且名称由更改它们的模块“拥有”

相关问题 更多 >