2012-07-02 41 views

Trả lời

29

c[:] = a nó có nghĩa là thay thế tất cả các yếu tố của c bởi các yếu tố của một

>>> l = [1,2,3,4,5] 
>>> l[::2] = [0, 0, 0] #you can also replace only particular elements using this 
>>> l 
[0, 2, 0, 4, 0] 

>>> k = [1,2,3,4,5] 
>>> g = ['a','b','c','d'] 
>>> g[:2] = k[:2] # only replace first 2 elements 
>>> g 
[1, 2, 'c', 'd'] 

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> c[:] = a  #creates a shallow copy 
>>> a[0].append('foo') #changing a mutable object inside a changes it in c too 
>>> a 
[[1, 2, 3, 'foo'], [4, 5, 6], [7, 8, 9]] 
>>> c 
[[1, 2, 3, 'foo'], [4, 5, 6], [7, 8, 9]] 

d = b[:] phương tiện tạo ra một bản sao cạn của b và gán nó vào d, nó cũng tương tự như d = list(b)

>>> l = [1,2,3,4,5] 
>>> m = [1,2,3] 
>>> l = m[::-1] 
>>> l 
[3,2,1] 

>>> l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> m = l[:] #creates a shallow copy 
>>> l[0].pop(1) # a mutable object inside l is changed, it affects both l and m 
2 
>>> l 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
>>> m 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
+1

Rất hùng hồn tuyên bố. (+1 từ tôi) – mgilson

+0

+1 cho lời giải thích ngắn gọn và rõ ràng – Levon

+0

là có bất kỳ chức năng khác biệt khôn ngoan? –

2

Không có nhiều khác biệt. c[:]=a cập nhật danh sách mà c đề cập đến tại chỗ. d=b[:] tạo danh sách mới là bản sao của b (quên danh sách cũ bạn đã tạo trên dòng thứ 4). Trong hầu hết các ứng dụng, bạn sẽ không thấy sự khác biệt trừ khi bạn có các tham chiếu khác cho các mảng nằm xung quanh. Tất nhiên, với phiên bản c[:]=..., bạn phải có danh sách c ngồi xung quanh.

4

Những gì Ashwini nói. :) tôi sẽ xây dựng một chút:

In [1]: a=[1,2,3] 

In [2]: b = a 

In [3]: c = a[:] 

In [4]: b, c 
Out[4]: ([1, 2, 3], [1, 2, 3]) 

In [5]: a is b, a is c 
Out[5]: (True, False) 

và theo cách khác:

In [1]: a = [1,2,3] 

In [2]: aold = a 

In [3]: a[:] = [4,5,6] 

In [4]: a, aold 
Out[4]: ([4, 5, 6], [4, 5, 6]) 

In [5]: a = [7,8,9] 

In [6]: a, aold 
Out[6]: ([7, 8, 9], [4, 5, 6]) 

Xem những gì sẽ xảy ra?

2

Ashwini's answer mô tả chính xác những gì đang xảy ra, dưới đây là một vài ví dụ về sự khác biệt giữa hai phương pháp:

a=[1,2,3] 
b=[4,5,6] 
c=[] 
c2=c 
d=[] 
d2=d 

c[:]=a       # replace all the elements of c by elements of a 
assert c2 is c     # c and c2 should still be the same list 
c2.append(4)      # modifying c2 will also modify c 
assert c == c2 == [1,2,3,4] 
assert c is not a     # c and a are not the same list 

d=b[:]       # create a copy of b and assign it to d 
assert d2 is not d    # d and d2 are no longer the same list 
assert d == [4,5,6] and d2 == [] # d2 is still an empty list 
assert d is not b     # d and b are not the same list 
Các vấn đề liên quan