2015-10-17 15 views
11

Khi đọc profile.py thư viện chuẩn python, tôi đã xem câu lệnh gán sys.argv[:] = args, được sử dụng để sửa đổi sys.argv để làm cho chương trình được lược tả xem các đối số dòng lệnh chính xác. Tôi hiểu rằng điều này khác với sys.argv = args[:] trong các hoạt động thực tế, nhưng có hiệu lực chúng trông giống như tôi. Có tình huống nào khi người ta muốn sử dụng cái này chứ không phải cái kia? Và là a[:] = b một thành ngữ python phổ biến?Chỉ định cho so với slice

CẬP NHẬT: trong trường hợp cụ thể này, tại sao một người lại chọn người kia? (Nguồn có thể được tìm thấy trong main chức năng của profile.py)

Trả lời

9

Sự khác biệt là, khi bạn sử dụng a[:] = b nó có nghĩa là bạn sẽ ghi đè lên bất cứ điều gì đã là trên a. Nếu bạn có thứ gì khác có tham chiếu đến a thì cũng sẽ thay đổi vì nó liên tục tham chiếu cùng một vị trí.

Mặt khác, a = b[:] tạo tham chiếu mới và sao chép tất cả các giá trị từ b sang tham chiếu mới này. Vì vậy, các tham chiếu hiện có đối với dữ liệu cũ sẽ tiếp tục trỏ đến dữ liệu cũ.

Hãy xem xét ví dụ sau:

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> c = a # c is a reference to the list in a 
>>> c 
[1, 2, 3] 
>>> 
>>> a[:] = b 
>>> a # a will have a copy of the list in b 
[4, 5, 6] 
>>> C# and c will keep having the same value as a 
[4, 5, 6] 
>>> 
>>> b = [7, 8, 9] 
>>> a = b[:] 
>>> a # a has the new value 
[7, 8, 9] 
>>> C# c keeps having the old value 
[4, 5, 6] 
+0

Cảm ơn bạn, tôi nhận ra rằng điều này làm cho một sự khác biệt nếu có tài liệu tham khảo khác cho 'a' –

+3

Có thể hữu ích để cung cấp cho một ví dụ. Nếu 'x = [1, 2, 3]', và 'a = x' (vì vậy chúng tham chiếu cùng một danh sách), làm' a = b [:] 'thay thế _reference_ trong' a' bằng một bản sao của 'b '; 'x' không thay đổi. Mặt khác, 'a [:] = b' thay thế _contents_ của' a' (tham chiếu không đổi) với các giá trị từ 'b', có nghĩa là' x' cũng được sửa đổi; liên kết tham chiếu chưa bao giờ bị hỏng. – ShadowRanger

+0

Tôi đã chỉnh sửa để thêm các chi tiết khác. Nhưng một ví dụ nên là một điều tốt. Tôi sẽ thêm nó. –

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