关于python和.join()方法的一个基本问题是:
file1 = open(f1,"r")
file2 = open(f2,"r")
file3 = open("results","w")
diff = difflib.Differ()
result = diff.compare(file1.read(),file2.read())
file3.write("".join(result)),
上面的代码片段产生一个很好的输出,以字符串格式存储在一个名为“results”的文件中,逐行显示两个文件之间的差异。但是我注意到,如果我只打印“result”而不使用.join(),编译器将返回包含内存地址的消息。在尝试在不使用.join()的情况下将结果写入文件后,编译器通知我.join()方法中只能使用字符串和字符缓冲区,而不能使用生成器对象。因此,根据我提出的所有证据,如果我错了,请纠正我:
result = diff.compare(file1.read(),file2.read())
<;----结果是生成器对象?
result
是字符串列表,其中result
本身是对第一个字符串的引用?
.join()
获取一个内存地址并指向第一个,然后遍历该结构中字符串的其余地址?
生成器对象是返回指针的对象?
如果我的问题不清楚,我很抱歉,但我基本上想问python老兵我的推断是否正确。我的问题不是关于可观察的结果,而是关于python的内部工作。谢谢你的帮助。
join
是一种字符串方法。该方法接受任何iterable并对其进行迭代,然后将内容连接在一起。(内容必须是字符串,否则将引发异常。)如果尝试将生成器对象直接写入文件,则只会获取生成器对象本身,而不是其内容。
join
“展开”生成器的内容。您可以看到一个简单的显式生成器的情况:
发电机一次一个地放出里面的东西。如果你试着观察生成器本身,它不会释放任何东西,你只是把它看作“生成器对象”。要了解它的内容,需要对其进行迭代。你可以通过一个
for
循环、一个next
函数或者任何其他迭代事物的函数/方法(其中有str.join
)来实现。当你说结果“是一个字符串列表”时,你就接近了这个想法。生成器(或iterable)有点像“潜在列表”。它不是一次把所有的内容都列成一个列表,而是让你一次一个地把每一个项目剥离。
没有一个对象是“内存地址”。生成器对象(与许多其他对象一样)的字符串表示形式包含一个内存地址,因此,如果您将其打印(如上所述)或将其写入文件,您将看到该地址。但这并不意味着对象“就是”那个内存地址,而地址本身也不是真正可用的。这只是一个方便的识别标签,如果你有多个对象,你可以把它们分开。
相关问题 更多 >
编程相关推荐