2012-02-23 30 views
6

tôi không thể tìm thấy thông tin ngắn gọn về những gì đang xảy ra trong chương trình này rất đơn giản:Python biến xử lý, tôi không hiểu nó

print 'case 1' 
# a and b stay different 
a = [1,2,3] 
b = a 
b = [4,5,6] 

print 'a =',a 
print 'b =',b 

print 
print 'case 2' 
# a and b becomes equal 
a = [1,2,3] 
b = a 
b[0] = 4 
b[1] = 5 
b[2] = 6 

print 'a =',a 
print 'b =',b 
print 

print 'case 3' 
# a and b stay different now 
a = [1,2,3] 
b = a[:] 
b[0] = 4 
b[1] = 5 
b[2] = 6 
print 'a =',a 
print 'b =',b 
print 

print 'case 4' 
# now the funny thing 
a=[1,2,[3]] 
b=a[:] 
b[0] = 4 
b[1] = 5 
b[2][0] = 6 # this modifies b and a!!! 

Kết quả của bài kiểm tra đơn giản này là:

case 1 
a = [1, 2, 3] 
b = [4, 5, 6] 

case 2 
a = [4, 5, 6] 
b = [4, 5, 6] 

case 3 
a = [1, 2, 3] 
b = [4, 5, 6] 

case 4 
a = [1, 2, [6]] 
b = [4, 5, [6]] 

Tôi rõ ràng không hiểu cách python xử lý từng trường hợp. Có ai có thể cung cấp một liên kết để tôi có thể đọc về nó, hoặc giải thích ngắn gọn về những gì đang xảy ra?

Cảm ơn rất nhiều.

Trả lời

6

Có hai điều quan trọng ở đây:

  • Biến chỉ là nhãn trỏ đến đối tượng
  • Danh sách là có thể thay đổi trong python và số nguyên thì không.

Khi bạn thấy rằng cả hai ab đều được sửa đổi, thì đó là vì cả hai đều trỏ đến cùng một đối tượng. Bạn có thể làm id(a)id(b) để xác nhận điều này.

Về ví dụ, lưu ý rằng a[:] sẽ tạo đối tượng mới là bản sao a. Tuy nhiên, nó sẽ là một bản sao nông, không phải là một bản sao sâu. Điều này giải thích tại sao trong ví dụ 4, bạn vẫn có thể sửa đổi cả hai ab. Họ đang trỏ đến các đối tượng danh sách khác nhau, nhưng một phần tử là một danh sách khác được chia sẻ bởi cả hai.

4

Trường hợp 1: Tên b được khôi phục.

Trường hợp 2: ab bị ràng buộc với cùng một đối tượng.

Trường hợp 3: Bản sao nông a bị ràng buộc với b. Các danh sách khác nhau, nhưng các đối tượng trong danh sách giống nhau.

Trường hợp 4: Bản sao nông a bị ràng buộc thành b và sau đó một trong các đối tượng bị đột biến.

Việc khôi phục không bị đột biến và đột biến không hồi phục.

3
print 'case 1' 
# a and b stay different 
a = [1,2,3] 
b = a    #At this point 'b' and 'a' are the same, 
        #just names given to the list 
b = [4,5,6]  #At this point you assign the name 'b' to a different list 

print 'a =',a 
print 'b =',b 

print 
print 'case 2' 
# a and b becomes equal 
a = [1,2,3]  #At this point 'b' and 'a' are the same, 
        #just names given to the list 
b = a 
b[0] = 4   #From here you modify the list, since both 'a' and 'b' 
        #reference the same list, you will see the change in 'a' 
b[1] = 5 
b[2] = 6 


print 'case 3' 
# a and b stay different now 
a = [1,2,3] 
b = a[:]    #At this point you COPY the elements from 'a' into a new 
         #list that is referenced by 'b' 
b[0] = 4    #From here you modify 'b' but this has no connection to 'a' 
b[1] = 5 
b[2] = 6 
print 'a =',a 
print 'b =',b 
print 

print 'case 4' 
# now the funny thing 
a=[1,2,[3]] 
b=a[:]   #At this point you COPY the elements from 'a' into a new 
       #list that is referenced by 'b' 
b[0] = 4  #Same as before 
b[1] = 5 
b[2][0] = 6 # this modifies b and a!!! #Here what happens is that 'b[2]' holds 
       #the same list as 'a[2]'. Since you only modify the element of that 
       #list that will be visible in 'a', try to see it as cases 1/2 just 
       #'recursively'. If you do b[2] = 0, that won't change 'a' 
+0

Giải thích nổi bật. Điều này đã giúp tôi rất nhiều, đặc biệt là câu lệnh [:]. Cảm ơn. – trinkner

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