2015-11-28 18 views
5

tôi đã có dòng sau trong một vòng lặp xảy ra trong thời gian khởi tạo của một lớp danh sách đơn lẻ liên kết:Semantics của 'x = y = z' chuyển nhượng bằng Python

previous = previous.pointer = Node(item, None) 

Ngữ nghĩa dành là những gì tôi có thể có được với :

previous.pointer = Node(item, None) 
previous = previous.pointer 

gì tôi phát hiện ra sử dụng pdb là previous được bố trí cho các đối tượng mới Node. Và thuộc tính con trỏ (cũ) previous không thay đổi.

Tôi không thể tìm thấy tài liệu về hành vi dự kiến ​​của loại bài tập này.

Trả lời

4

này được giải thích trong the documentation:

Một câu lệnh gán đánh giá danh sách biểu thức (nhớ rằng đây có thể là một biểu hiện đơn lẻ hoặc một danh sách bằng dấu phẩy, sau này năng suất một tuple) và chuyển nhượng đối tượng kết quả duy nhất cho mỗi của danh sách đích, từ trái sang phải.

(tôi nhấn mạnh)

Trường hợp hạn target_list được sử dụng trong ngữ pháp như sau:

assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) 

(Lưu ý các dấu hiệu + sau ngoặc đầu tiên - điều này cho phép tập chuỗi)

Do đó, ngữ nghĩa kết quả:

target_list1 = target_list2 = expression 

tương đương với:

target_list1 = expression 
target_list2 = expression 

Không có cách khó hiểu những gì đang được giao (đánh giá danh sách biểu) với mục tiêu của công việc là gì, bởi vì nhiệm vụ là một tuyên bố, không phải là biểu thức . Do đó, tất cả với = trong đó, sẽ không được coi là một biểu thức - chỉ là phần chính xác nhất. Tiếp theo, tất cả các câu lệnh gán sẽ được xử lý từ trái sang phải (tức là danh sách đích của chúng sẽ được gán giá trị của biểu thức).

2

Nó nên gán cả hai, previous.pointerprevious đến vừa được tạo ra Node, hiệu quả đồng thời .

Tôi không chắc cái nào được giao đầu tiên (hoặc nếu đó là thậm chí xác định bởi các đặc điểm kỹ thuật - mặc dù nó chỉ nên vật chất trong trường hợp của mô tả như BUILTIN property).

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