我有一个包含两个全局变量的文件
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
为什么我可以访问列表而不能访问测试文件中的字符串?似乎如果一个有效,另一个也应该有效
简而言之,这是因为
+=
对列表和字符串执行不同的操作字符串是不可变的。因此,在A.py中
root += ...
创建一个新字符串并将其分配给root
。有两个对root
的引用:一个在A.py中,另一个在测试脚本中。在A.py中,root +=
行只更改root
,因为这是A.py中函数唯一可以访问的行。测试模块中的root
没有更改列表是可变的。因此,
crumbs +=
修改现有的列表,并且不更改crumbs
指向的内容。由于crumbs
在A.py和您的测试模块中仍然引用相同的列表,因此您可以看到测试模块中的更改如果您在编写这些语句时不使用
+=
,则会更清楚:root = root + ...
显然创建了一个新字符串,并将root
更改为指向它crumbs.extend(...)
显然,不会创建新列表,也不会更改crumbs
指向的内容当您尝试在模块之间访问变量而不使用完全限定名时,可能会出现这种小混乱。最终会有多个名称最初(在
import
之后)引用同一个对象,但后来发生了一些变化解决方法就是
import A
并在测试脚本中引用A.root
和A.crumbs
。这样,这些对象只有一个规范名称,并且名称由更改它们的模块“拥有”相关问题 更多 >
编程相关推荐