2011-12-06 26 views
5

Trước tiên, tôi sẽ bắt đầu như mọi người khác. Tôi mới đến python. Giáo viên của tôi đã cho tôi vấn đề:Phạm vi Python có thể thay đổi được và không thay đổi

def f(a, b, c): 
    a = 1 
    c = b 
    c[0] = 2 
a = 10 
b = [11, 12, 13] 
c = [13, 14, 15] 
f(a, b, c) 
print a, b, c 

It in:

10 [2, 12, 13] [13, 14, 15] 

Tôi hiểu rằng một đợt nghỉ tại 10 vì số nguyên là không thay đổi, nhưng tôi không hiểu tại sao thay đổi b và c không .

+2

Tôi cũng chỉ ra rằng điều này không liên quan đến các loại dữ liệu có thể thay đổi/không thay đổi được. Như các câu trả lời dưới đây chỉ ra, đây là về chuyển nhượng biến. [Mô hình dữ liệu] (http://docs.python.org/reference/datamodel.html) trang thảo luận về sự khác biệt đó. – Rob

+0

điều gì khiến bạn khó hiểu chỉ là tên biến, tôi đoán vậy. cho những cái bên ngoài hàm có tên khác nhau, ví dụ x, y, z, vì vậy bạn muốn gọi f (x, y, z) và in x, y, z. Và tôi chắc chắn nó sẽ không khó để nhìn thấy. – Danny

Trả lời

4
c = b 
c[0] = 2 

Vì bạn đang thiết c để trỏ đến b, Bạn có thể chỉ là một cách dễ dàng làm được điều này:

def f(a, b, unused): # notice c isn't in the parameter list 
    a = 1 
    c = b # c is declared here 
    c[0] = 2 # c points to b, so c[0] is b[0] 

Bây giờ rõ ràng là c luôn giống nhau như b, vậy tại sao không chỉ cần loại bỏ nó:

def f(a, b, unused): 
    a = 1 
    b[0] = 2 

Và bây giờ rõ ràng là bạn đang thay đổi thành phần đầu tiên là b và không làm bất cứ điều gì để c, và hãy nhớ, đây là chức năng giống hệt với bản gốc.

2

Điều quan trọng là phải hiểu các biến như gợi ý dưới mui xe:

def f(a, b, c): 
    a = 1 # a is a single scalar value, so no pointing involved 
    c = b # point the local "c" pointer to point to "b" 
    c[0] = 2 # change the 2nd value in the list pointed to by "c" to 2 

Khi bạn gọi f (a, b, c), chỉ b thực sự được thay đổi. Biến "c" bên trong việc thực hiện hàm khác với việc triển khai "c" bên ngoài hàm.

0

a không giữ lại giá trị 10 vì nó không thay đổi. Nó giữ nguyên giá trị 10 vì khi bạn gọi a = 1 trong phạm vi địa phương là f() bạn tạo một biến mới.

Khi bạn gọi c = b bên trong f(), địa phương c trở thành tham chiếu cục bộ đối tượng có thể thay đổi được biểu thị bằng b. Khi bạn gán lại các giá trị trong đối tượng có thể thay đổi đó, thay đổi được phản ánh trong đối tượng gốc.