2014-10-16 11 views
5

Python có câu lệnh gán tăng cường tương ứng với toán tử boolean của nó không?phân bổ tăng cường python cho các toán tử boolean

Ví dụ tôi có thể viết này:

x = x + 1 

hay này:

x += 1 

Có điều gì tôi có thể viết thay cho này:

x = x and y 

Để tránh viết " x "hai lần?

Lưu ý rằng tôi biết các câu lệnh sử dụng & =, nhưng tôi đang tìm kiếm một câu lệnh có thể hoạt động khi y là kiểu bất kỳ, không chỉ khi y là boolean.

+3

Câu trả lời ngắn gọn: không. Câu trả lời dài hơn: các toán tử boolean sẽ không bao giờ ảnh hưởng đến các toán hạng, do đó, một phiên bản tại chỗ sẽ không giúp bạn điều gì. Bạn liên kết với 'x' hoặc' y', không thay đổi đối tượng được tham chiếu bởi 'x'. –

+0

@MartijnPieters có ý nghĩa, cảm ơn bạn! – nonagon

Trả lời

2

Không, không có augmented assignment operator cho số boolean operators.

Phân bổ tăng cường tồn tại để cung cấp cho toán hạng bên trái có thể thay đổi cơ hội thay đổi đối tượng tại chỗ, thay vì tạo đối tượng mới. Mặt khác, các toán tử logic không thể dịch sang một phép toán tại chỗ; cho x = x and y bạn hoặc rebind x đến x hoặc bạn rebind nó thành y, nhưng xchính nó sẽ không thay đổi.

Như vậy, x and= y thực sự sẽ khá khó hiểu; hoặc x sẽ không thay đổi hoặc được thay thế bằng y.

Trừ khi bạn có đối tượng boolean thực tế, làm không sử dụng &=|= bài tập tăng cường cho bitwise operators. Chỉ đối với các đối tượng boolean (vì vậy TrueFalse) là các toán tử đó bị quá tải để tạo ra cùng một đầu ra như các toán tử andor. Đối với các loại khác, chúng sẽ dẫn đến kết quả là TypeError hoặc hoàn toàn hoạt động khác nhau. Đối với số nguyên, đó là một hoạt động bitwise, đặt quá tải nó để làm giao lộ.

+0

Xin lỗi để mở một chủ đề cũ, nhưng lời giải thích của Martjin tại sao không có phiên bản tăng cường của toán tử boolean tồn tại là không chính xác. Trong thực tế, hướng dẫn tham chiếu Python nói rằng hành vi tại chỗ là tùy chọn và được thực hiện chỉ khi có thể (xem [Câu lệnh gán được tăng cường] (https://docs.python.org/2.7/reference/simple_stmts.html#augmented-assignment -các câu lệnh)). – davidedb

+0

Ví dụ, nếu 'x = 1', phép gán' x + = 3' hoạt động và rebind 'x' thành' 4', mà không sửa đổi số '1' _in-place_. – davidedb

+0

@davidedb: không có ** boolean ** hoạt động tăng cường nào. Không có 'và =' hoặc 'hoặc =', bởi vì sự phục hồi sẽ phụ thuộc vào kết quả của toán tử * độc lập với kiểu *. –

3

Biểu thức tương đương là &= cho and|= cho or.

>>> b = True 
>>> b &= False 
>>> b 
False 

Note bitwise ANDbitwise OR và sẽ chỉ làm việc (như bạn mong đợi) cho bool loại. bitwise AND khác với logical AND với nhiều loại khác, chẳng hạn như số

>>> bool(12) and bool(5) # logical AND 
True 

>>> 12 & 5 # bitwise AND 
4 

Xin xem this post cho một cuộc thảo luận kỹ hơn về Bitwise vs phép toán logic trong bối cảnh này.

+4

Không, không thực sự. Điều này chỉ hoạt động trên các giá trị boolean. Trên mọi thứ khác, nó sẽ là một lỗi hoặc * bitwise và *. –

+0

+1 mặc dù thats không chính xác như nhau 'và' ... nó chắc chắn hoạt động cho các loại boolean đơn giản –

+0

@JoranBeasley: Câu trả lời phải làm cho rằng rõ ràng, tuy nhiên. Ngay bây giờ, có vẻ như ai đó đã nhầm lẫn giữa các toán tử bitwise và boolean, chỉ vì kiểu boolean xử lý cả hai. –

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