2013-07-16 33 views
10

Trong Java, khai báo rõ ràng các chuỗi được thực thi bởi JVM, để các khai báo tiếp theo của cùng một chuỗi kết quả trong hai con trỏ tới cùng một cá thể String, thay vì hai chuỗi riêng biệt (nhưng giống hệt nhau).Có phải là chuỗi thực tập Python không?

Ví dụ:

public String baz() { 
    String a = "astring"; 
    return a; 
} 

public String bar() { 
    String b = "astring" 
    return b; 
} 

public void main() { 
    String a = baz() 
    String b = bar() 
    assert(a == b) // passes 
} 

Câu hỏi của tôi là, không CPython (hoặc bất kỳ thời gian chạy Python khác) làm điều tương tự cho các chuỗi? Ví dụ, nếu tôi có một số lớp:

class example(): 
    def __init__(): 
     self._inst = 'instance' 

Và tạo 10 trường hợp của lớp này, sẽ mỗi người trong số họ có một biến Ví dụ đề cập đến cùng một chuỗi trong bộ nhớ, hoặc tôi sẽ kết thúc với 10 chuỗi riêng biệt ?

+3

Điều này được gọi là thực tập, và có, Python thực hiện việc này để mở rộng, cho các chuỗi ngắn hơn được tạo thành chuỗi ký tự. Xem [Python chuỗi interning] (http://stackoverflow.com/q/15541404) –

+0

có thể trùng lặp của [Python '==' vs 'là' so sánh chuỗi, 'là' không đôi khi, tại sao?] (Http: // stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why) – OptimusCrime

+0

@MartijnPieters - cảm ơn, nhưng chỉ ngắn như thế nào là "ngắn hơn" dây? Thời gian chạy này có phụ thuộc hay không, hoặc có tiêu chuẩn cho nó không? – csvan

Trả lời

11

Điều này được gọi là thực tập, và có, Python thực hiện việc này ở một mức độ nào đó, đối với các chuỗi ngắn hơn được tạo thành chuỗi ký tự. Xem About the changing id of a Python immutable string để thảo luận.

Thời gian chạy phụ thuộc vào thời gian chạy, không có tiêu chuẩn cho nó. Interning luôn là một sự cân bằng giữa việc sử dụng bộ nhớ và chi phí kiểm tra nếu bạn đang tạo ra cùng một chuỗi. Có một built-in intern() function để buộc các vấn đề nếu bạn đang nghiêng như vậy, mà tài liệu một số của thực tập Python làm cho bạn tự động:

Thông thường, những cái tên được sử dụng trong các chương trình Python sẽ được tự động thực tập nội trú, và các bộ từ điển sử dụng để giữ các thuộc tính module, class hoặc instance có các khóa bên trong.

Lưu ý rằng Python 3 đã chuyển chức năng intern() sang sys module.

+0

Lưu ý rằng nội trang 'được tạo sẵn dường như đã bị xóa trong Python 3. Tôi không cảm thấy như tìm hiểu chính xác phiên bản nào ngay bây giờ. – zwol

+0

@zwol: 3.0. Tôi sẽ xem liệu tôi có thể tìm ra động lực, có lẽ trong một PEP ở đâu đó. –

+0

@zwol: nó đã được chuyển sang mô-đun 'sys'. –

3

Cách khá dễ hiểu là sử dụng id(). Tuy nhiên, như @MartijnPieters đề cập, đây là thời gian chạy phụ thuộc.

class example(): 

    def __init__(self): 
     self._inst = 'instance' 

for i in xrange(10): 
    print id(example()._inst) 
Các vấn đề liên quan