2012-11-24 34 views
8
>>>a=[999999,2,3] 
    >>>b=[999999,2,3] 
    >>>print(a[0] is b[0]) 
    False#because it works for numbers -5 through 256 
    >>>a=[1,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#because it works for numbers -5 through 256 
    >>>a=[999999,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#why not False ??? 

điều gì xảy ra b = a [:] (tại sao không hoạt động với các số từ -5 đến 256)?điều gì xảy ra b = a [:] trong python?

+0

Tôi nghĩ bạn đang nhầm lẫn hai điều lạ: 1) 'b = a [:]' sao chép tham chiếu đến tất cả các số nguyên, do đó, 'b [0]' trỏ tới cùng một int như 'a [0]' và 'a [0] là b [0]' trả về 'True'. 2) refs đến các số -5 đến 256 được giữ ở tất cả các lần. – Shep

Trả lời

11

Các -5 đến 256 phạm vi đã làm với các following:

Việc thực hiện giữ một mảng của các đối tượng số nguyên cho tất cả các số nguyên giữa -5 và 256, khi bạn tạo một int trong phạm vi đó bạn thực sự chỉ lấy lại một tham chiếu đến đối tượng hiện có.

Để chứng minh điều này, hãy chú ý cách id(123) giữ trở về giá trị như nhau, trong khi id(9999) có thể trả về giá trị khác nhau:

In [18]: id(123) 
Out[18]: 9421736 

In [19]: id(123) 
Out[19]: 9421736 

In [20]: id(9999) 
Out[20]: 9708228 

In [21]: id(9999) 
Out[21]: 10706060 

Đây là khóa học một artefact của việc thực hiện hiện hành. Việc triển khai Python khác có thể không thực hiện điều đó hoặc có thể sử dụng một phạm vi khác.

Đối với ví dụ cuối cùng của bạn:

In [14]: a=[999999, 2, 3] 

In [15]: b=a[:] 

In [16]: map(id, a) 
Out[16]: [10908252, 9421180, 9421168] 

In [17]: map(id, b) 
Out[17]: [10908252, 9421180, 9421168] 

Như bạn thấy, [:] chỉ đơn giản là sao chép tài liệu tham khảo. Điều này giải thích lý do tại sao a[i] is b[i] đánh giá là True cho tất cả i.

+0

Và lý do điều này là có thể là các số nguyên là không thay đổi. – kindall

+0

Ví dụ 'id (9999)' của bạn, nó càng trở nên khó hiểu hơn: hãy thử trong một lời nhắc Python 2.x thường xuyên thay vì IPython, và bạn sẽ thấy cùng một giá trị quay lại mỗi lần (vì cùng một khe nguyên là được tái sử dụng mỗi lần, sự tồn tại của lịch sử trong IPython làm cho điều này không thể, tất nhiên). –

0
a=[1,2,3] 

b=a làm b là bí danh của a. Điều đó có nghĩa, tất cả các thay đổi đối với b sẽ được nhìn thấy trong a.

b = a [:] có nghĩa là tạo bản sao và gán cho b.

1
>>>b=a[:] 

Tạo bản sao nông của các mục trong danh sách và tên sao chép b. Tất cả các mục chứa trong danh sách mới sẽ có cùng id đối tượng (suy nghĩ con trỏ) như các mục trong danh sách gốc. Đây là hành vi mong đợi.

1

Thêm vào @NPE's answer, đây là một minh hoạ đẹp:

a = range(-7, 259) 
b = range(-7, 259) 
for x, y in zip(a,b): 
    print x, x is y 

in:

-7 False 
-6 False 
-5 True 
-4 True 
... 
255 True 
256 True 
257 False 
258 False 
Các vấn đề liên quan