eaz*_*001 13 python string pointers list generator
关于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)),
Run Code Online (Sandbox Code Playgroud)
上面的代码片段以字符串格式生成一个存储在名为"results"的文件中的良好输出,逐行显示两个文件之间的差异.但是我注意到,如果我只是在不使用.join()的情况下打印"result" ,编译器将返回包含内存地址的消息.在尝试将结果写入文件而不使用.join()之后,编译器通知我,在.join()方法中只能使用字符串和字符缓冲区,而不是生成器对象.因此,根据我提出的所有证据,如果我错了,请纠正我:
result = diff.compare(file1.read(),file2.read()) <----结果是生成器对象?
result是一个字符串列表,它result本身是第一个字符串的引用?
.join() 获取一个内存地址并指向第一个,然后迭代该结构中字符串的其余地址?
生成器对象是一个返回指针的对象?
如果我的问题不清楚,我道歉,但我基本上想问问python退伍军人,如果我的扣除是正确的.我的问题不是关于可观察的结果,而是更多关于python的内部工作原理.我感谢你的所有帮助.
Bre*_*arn 30
join是一种字符串的方法.该方法采用任何迭代并迭代它并将内容连接在一起.(内容必须是字符串,否则会引发异常.)
如果您尝试将生成器对象直接写入文件,您将只获取生成器对象本身,而不是其内容. join"展开"发电机的内容.
你可以看到一个简单的显式生成器会发生什么:
def gen():
yield 'A'
yield 'B'
yield 'C'
>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC
Run Code Online (Sandbox Code Playgroud)
发电机一次发出一个内容.如果您试图查看生成器本身,它不会发生任何事情,您只是将其视为"生成器对象".要获取其内容,您需要迭代它们.您可以使用for循环,next函数或任何其他迭代事物的函数/方法(str.join其中)来完成此操作.
当你说结果"是一个字符串列表"时,你就会接近这个想法.生成器(或可迭代的)有点像"潜在列表".取而代之的居然是其所有内容的列表中的所有一次,它可以让您一次剥离各项目之一.
没有任何对象是"内存地址".生成器对象的字符串表示形式(与许多其他对象的字符串表示形式一样)包含内存地址,因此如果您打印它(如上所述)或将其写入文件,您将看到该地址.但这并不意味着对象"是"那个内存地址,并且地址本身并不是真正可用的.它只是一个方便的识别标签,所以如果你有多个对象,你可以区分它们.
| 归档时间: |
|
| 查看次数: |
27182 次 |
| 最近记录: |