Tôi đã tìm kiếm các câu hỏi về tràn web và ngăn xếp nhưng không thể tìm thấy câu trả lời cho câu hỏi này. Quan sát mà tôi đã thực hiện là trong Python 2.7.3, nếu bạn chỉ định hai biến cùng một chuỗi ký tự, ví dụ:Trong trường hợp nào các chuỗi bằng nhau chia sẻ cùng một tham chiếu?
>>> a = 'a'
>>> b = 'a'
>>> c = ' '
>>> d = ' '
Sau đó, các biến sẽ chia sẻ các tài liệu tham khảo giống nhau:
>>> a is b
True
>>> c is d
True
Điều này cũng đúng đối với một số chuỗi dài hơn:
>>> a = 'abc'
>>> b = 'abc'
>>> a is b
True
>>> ' ' is ' '
True
>>> ' ' * 1 is ' ' * 1
True
Tuy nhiên, có rất nhiều trường hợp các tài liệu tham khảo is (unexpectantly) not shared:
>>> a = 'a c'
>>> b = 'a c'
>>> a is b
False
>>> c = ' '
>>> d = ' '
>>> c is d
False
>>> ' ' * 2 is ' ' * 2
False
Ai đó có thể giải thích lý do cho điều này?
Tôi nghi ngờ có thể có sự đơn giản hóa/thay thế được thực hiện bởi thông dịch viên và/hoặc một số cơ chế lưu bộ nhớ đệm sử dụng thực tế là các chuỗi python không thay đổi được trong một số trường hợp đặc biệt. Tôi đã thử tạo các bản sao sâu của các chuỗi bằng cách sử dụng hàm tạo str và hàm copy.deepcopy nhưng các chuỗi vẫn không nhất quán chia sẻ các tham chiếu.
Lý do tôi gặp vấn đề với điều này là vì tôi kiểm tra sự bất bình đẳng của các tham chiếu đến chuỗi trong một số bài kiểm tra đơn vị tôi đang viết cho các phương pháp nhân bản của các lớp python kiểu mới.
Cảm ơn bạn đã trả lời của bạn, có vẻ như bạn là chính xác về điều đó literals chuỗi trong mã nguồn luôn thực tập nội trú (chuỗi mà không phải là các chữ không có tài sản này). Do đó, các ví dụ của tôi chỉ hợp lệ khi viết trong trình thông dịch tương tác python. Tôi đang sử dụng CPython và câu trả lời của bạn xác nhận một số nghi ngờ của tôi. Tôi đồng ý rằng toán tử == nên được sử dụng để kiểm tra chuỗi cho sự bình đẳng. Có cách nào thanh lịch để kiểm tra nơi một thuộc tính được khởi tạo hay tôi nên tránh loại thử nghiệm này? – EriF89
@ EriF89: Kiểm tra "nơi một thuộc tính được khởi tạo" nghĩa là gì? Và nó quan trọng như thế nào? –
Vì tôi đang viết các bài kiểm tra để đảm bảo rằng các tham chiếu thuộc tính không được chia sẻ không đúng giữa các đối tượng nhân bản, tôi muốn một cách chung để kiểm tra những thay đổi trong một trong các đối tượng không bị rò rỉ. Tôi nghĩ toán tử is sẽ làm điều này nhưng vì các tham chiếu được chia sẻ, tôi đoán tôi phải gán các giá trị mới cho các thuộc tính của một trong các đối tượng, và kiểm tra xem chúng có thay đổi trong các đối tượng khác hay không. – EriF89