2013-08-08 37 views
13

Tại sao công việc nàyPython làm tăng nhiều biến inline

>> x, y = (1, 2) 
>> print x, y 
1 2 

Nhưng làm tăng kết quả trong các lỗi cú pháp ..

>> x, y -= (1, 2) 
SyntaxError: illegal expression for augmented assignment 

Có một cách khác nhau, tôi đã mong đợi:

>> x, y -= (1, 2) 
>> print x, y 
0 0 

Trả lời

11

Bạn không thể sử dụng câu lệnh gán tăng cường trên nhiều mục tiêu, không.

Trích dẫn các augmented assignment documentation:

Ngoại trừ giao cho các bộ và nhiều mục tiêu trong một tuyên bố đơn, sự phân công thực hiện bằng câu lệnh gán Augmented được xử lý theo cùng một cách như bài tập bình thường. Tương tự, ngoại trừ có thể có tại chỗ hành vi, thao tác nhị phân được thực hiện bằng cách gán tăng cường cũng giống như các phép toán nhị phân thông thường.

Mỏ nhấn mạnh.

Chỉ định tăng cường tại chỗ được dịch từ target -= expression sang target = target.__isub__(expression) (với các móc nối tương ứng __i...__ cho mỗi nhà điều hành) và dịch hoạt động đó sang nhiều mục tiêu không được hỗ trợ.

Dưới mui xe, chuyển nhượng tăng cường là một chuyên môn của các nhà khai thác nhị phân (+, *, -, vv), không chuyển nhượng. Bởi vì việc thực hiện dựa trên những toán tử đó và toán tử nhị phân chỉ có hai toán hạng, nên nhiều mục tiêu không bao giờ được bao gồm trong bản gốc implementation proposal.

Bạn sẽ phải chỉ cần áp dụng các bài tập riêng biệt:

x -= 1 
y -= 2 

hoặc, nếu bạn thực sự, thực sự muốn có được phức tạp, sử dụng các mô-đun operatorzip() để áp dụng operator.isub để các kết hợp (thông qua itertools.starmap(), sau đó sử dụng phân tuple:

from operator import sub 
from itertools import starmap 

x, y = starmap(operator.isub, zip((x, y), (1, 2))) 

nơi isub sẽ đảm bảo rằng móc đúng được gọi là cho phép tại chỗ trừ với nhiều loại có thể thay đổi thứ hỗ trợ nó.

hoặc, nếu bạn đang thao tác loại không hỗ trợ thao tác tại chỗ, sử dụng một biểu thức máy phát điện cũng đủ:

x, y = (val - delta for val, delta in zip((x, y), (1, 2))) 
2

x, y = (1, 2) Đây là nhiệm vụ thứ tự. Nó dựa vào phía bên tay phải là một đối tượng có thể lặp lại, và phía bên tay trái được tạo thành từ cùng một số biến như việc lặp lại phía bên tay trái cung cấp.

x, y -= (1, 2) này đang cố gọi phương thức __isub__ trên (các) toán hạng bên trái.Bản chất của một nhiệm vụ tại chỗ ("tăng cường") là nó phải có một biến ở phía bên trái của nó, có giá trị nhận được cuộc gọi của nhà điều hành, và biến đó nhận được kết quả của cuộc gọi đó. Python không cho phép phân phối một bài tập tại chỗ qua nhiều mục tiêu.