我有一个包含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?似乎如果一个人工作,其他人也应该工作.
简而言之,这是因为+=
列表和字符串做了不同的事情.
字符串是不可变的.因此,root += ...
在A.py中创建一个新字符串并将其分配给root
.有两个引用root
:一个在A.py中,一个在测试脚本中.该root +=
行仅root
在A.py中更改,因为这是A.py中的函数唯一可以访问的行.该root
测试模块中没有改变.
列表是可变的.因此,crumbs +=
修改现有列表,并且不会更改crumbs
指向的内容.由于crumbs
仍然在A.py和测试模块中引用相同的列表,因此您可以看到测试模块中的更改.
如果你写这些语句,没有它变得更加清晰+=
:
root = root + ...
显然,新的字符串和更改root
指向它crumbs.extend(...)
显然没有新的列表,也没有改变crumbs
指向的内容当您尝试在不使用完全限定名称的情况下访问模块之间的变量时,可能会出现这种混淆.最终会有多个名称,这些名称最初(跟随import
)引用同一个对象,但稍后会有一些更改.
该解决方案是只是为了import A
和参考A.root
,并A.crumbs
在您的测试脚本.这样,这些对象只有一个规范名称,名称由更改它们的模块"拥有".