Đó là vì Python tự động hoạt động như biến là toàn cầu trừ khi bạn xác định hoặc cố gắng sửa đổi nó trong hàm. Thử thêm global a
vào mã của bạn.
>>> a = 123
>>> def f():
... global a
... print a
... a = 456
... print a
...
>>> f()
123
456
>>> a
456
Trong ví dụ đầu tiên bạn không xác định và không sửa đổi, vì vậy, đây là ví dụ toàn cầu. Nhưng nếu bạn muốn, ví dụ, thêm 20 vào một, bạn cũng phải sử dụng global a
.
Cũng cần lưu ý rằng hàm a trong f là toàn cầu và giá trị của nó sẽ khác sau khi chạy hàm f.
Nếu bạn muốn tạo biến cục bộ, hãy nhớ, khai báo đó luôn đi trước khi đọc, vì vậy không thể thực hiện print a
trước a = 456
.
EDIT: Ok, trong khi chúng ta đang nói về việc đóng cửa và nguy hiểm khi sử dụng toàn cầu thì có khả năng khác.
>>> a = 123
>>> def f():
... b = a
... print b
... b = 456
... print b
...
>>> f()
123
456
>>> a
123
>>>
Ở đây chúng ta sử dụng một đóng cửa chỉ đọc khả năng để thực hiện một bản sao của a và hơn sửa đổi bản sao này, mà không modifing các a
biến bên ngoài AS miễn là nó là INTEGER. Hãy nhớ rằng, b
giữ một tham chiếu đến a
. Ví dụ: nếu a
, danh sách và hoạt động f
giống như b.append(3)
thì cả a
và b
sẽ có sẵn và được sửa đổi ngoài phạm vi.
Lựa chọn phương pháp khác nhau tùy theo nhu cầu.
Không có tham số để cung cấp tham chiếu biến cho phương thức, bạn sẽ phải dựa vào 'a' để khai báo trong mã, trước khi gọi hàm' f() 'chỉ để' in a' ở nơi đầu tiên. Tác dụng phụ rất nhiều. – Droogans
Tôi đã thêm một giải pháp cho vấn đề của bạn, nhưng theo cách thông thường, bạn chỉ muốn tránh việc viết gần. Chỉ cần tạo một biến trung gian và trả về kết quả. –