2013-01-21 28 views
9

Chỉ cần một câu hỏi cơ bản liên quan đến python và phương pháp .join():phát Python đối tượng và .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)), 

Đoạn mã trên mang lại một kết quả đẹp được lưu trữ trong một tập tin gọi là "kết quả", trong định dạng chuỗi , cho thấy sự khác biệt giữa hai tệp theo từng dòng. Tuy nhiên tôi nhận thấy rằng nếu tôi chỉ in "kết quả" mà không cần sử dụng .join(), trình biên dịch trả về một thông báo bao gồm địa chỉ bộ nhớ. Sau khi cố gắng ghi kết quả vào tập tin mà không cần sử dụng .join(), tôi được trình biên dịch thông báo rằng chỉ có chuỗi và bộ đệm ký tự có thể được sử dụng trong phương thức .join() chứ không phải đối tượng máy phát. Vì vậy, dựa tắt của tất cả các bằng chứng cho thấy tôi đã viện dẫn, hãy sửa lại cho tôi nếu tôi sai:

  1. result = diff.compare(file1.read(),file2.read()) < ---- Kết quả là một đối tượng phát?

  2. result là danh sách các chuỗi, với result chính nó là tham chiếu đến chuỗi đầu tiên?

  3. .join() lấy địa chỉ bộ nhớ và trỏ đến địa chỉ đầu tiên và sau đó lặp qua các địa chỉ còn lại của chuỗi trong cấu trúc đó?

  4. Đối tượng máy phát điện là đối tượng trả về con trỏ?

Tôi xin lỗi nếu câu hỏi của tôi không rõ ràng, nhưng về cơ bản tôi muốn hỏi các cựu chiến binh trăn nếu khoản khấu trừ của tôi là chính xác. Câu hỏi của tôi là ít hơn về các kết quả quan sát được, và nhiều hơn nữa về các hoạt động bên trong của python. Tôi đánh giá cao tất cả sự giúp đỡ của bạn.

+0

Tin nhắn là gì? – Marcin

+1

Bạn không có địa chỉ bộ nhớ; python cung cấp cho bạn một đại diện của một đối tượng, và mặc định cho các đối tượng tùy chỉnh là hiển thị kiểu và địa chỉ bộ nhớ của đối tượng. Vẫn còn một vật ở đó. –

Trả lời

22

join là một phương thức của chuỗi. Phương thức đó nhận bất kỳ iterable và iterates qua nó và tham gia các nội dung với nhau. (Nội dung phải là chuỗi, hoặc nó sẽ làm tăng ngoại lệ.)

Nếu bạn cố ghi đối tượng trình tạo trực tiếp vào tệp, bạn sẽ chỉ nhận được đối tượng trình tạo, chứ không phải nội dung của nó. join "unrolls" nội dung của bộ tạo.

Bạn có thể xem những gì đang xảy ra với một máy phát điện đơn giản, rõ ràng:

def gen(): 
    yield 'A' 
    yield 'B' 
    yield 'C' 

>>> g = gen() 
>>> print g 
<generator object gen at 0x0000000004BB9090> 
>>> print ''.join(g) 
ABC 

Các máy phát điện chủ tiệm ra nội dung của nó cùng một lúc. Nếu bạn cố gắng nhìn vào chính máy phát điện, nó không bỏ qua bất cứ thứ gì và bạn chỉ xem nó là "đối tượng máy phát". Để có được nội dung của nó, bạn cần phải lặp lại chúng. Bạn có thể làm điều này với một vòng lặp for, với chức năng next, hoặc với bất kỳ chức năng/phương pháp khác lặp đi lặp lại trên mọi thứ (str.join trong số đó).

Khi bạn nói kết quả "là danh sách chuỗi", bạn đang tiến gần đến ý tưởng. Một máy phát (hoặc có thể lặp lại) giống như một "danh sách tiềm năng". Thay vì thực sự một danh sách tất cả nội dung của nó cùng một lúc, nó cho phép bạn bóc từng mục một cùng một lúc.

Không có đối tượng nào là "địa chỉ bộ nhớ".Biểu diễn chuỗi của đối tượng máy phát (giống như nhiều đối tượng khác) bao gồm địa chỉ bộ nhớ, vì vậy nếu bạn in nó (như trên) hoặc ghi nó vào một tệp, bạn sẽ thấy địa chỉ đó. Nhưng điều đó không có nghĩa là đối tượng "là" địa chỉ bộ nhớ đó và chính địa chỉ đó thực sự không thể sử dụng được như vậy. Nó chỉ là một thẻ nhận dạng tiện dụng để nếu bạn có nhiều đối tượng, bạn có thể phân biệt chúng.

+2

Lưu ý rằng 'join' giả định rằng có thể lặp lại/chỉ sinh ra các chuỗi. Nó sẽ khiếu nại nếu đó không phải là trường hợp ... – mgilson

+6

Thú vị thực tế: Cho ''' .join()' một máy phát điện là * chậm hơn * hơn cho ''' .join()' kết quả của việc gọi 'danh sách() 'trên một máy phát điện. ''' .join (danh sách (kết quả))' nhanh hơn ''' .join (kết quả)'. –

+0

@Marcin: Thông điệp là: <đối tượng trình tạo đối tượng tại 0xb76526e4> – eazar001

Các vấn đề liên quan