Này, tôi có một số phạm vi với các biến, và một chức năng gọi là trong phạm vi này muốn thay đổi một số biến bất biến:Truy cập phạm vi bên ngoài trong Python 2.6
def outer(): s = 'qwerty' n = 123 modify() def modify(): s = 'abcd' n = 456
Có thể bằng cách nào đó để truy cập vào phạm vi bên ngoài? Một cái gì đó như nonlocal
biến từ Py3k.
Chắc chắn tôi có thể làm s,n = modify(s,n)
trong trường hợp này, nhưng điều gì sẽ xảy ra nếu tôi cần một số 'tiêm' chung thực hiện ở đó và phải có khả năng phân công lại cho các biến tùy ý?
tôi có hiệu suất trong tâm trí, vì vậy, nếu có thể, eval
& chồng kiểm tra khung không được chào đón :)
UPD: Đó là bất khả thi. Giai đoạn. Tuy nhiên, có một số tùy chọn cách truy cập các biến trong phạm vi bên ngoài:
- Sử dụng hình cầu. Bằng cách này,
func.__globals__
là một cuốn từ điển có thể thay đổi;) - Lưu trữ các biến trong một dict/lớp sơ thẩm/bất kỳ container có thể thay đổi khác
- Cho biến như các đối số & nhận được chúng trở lại như một tuple:
a,b,c = innerfunc(a,b,c)
- Tiêm khác chức năng của bytecode. Điều này là có thể với mô-đun python
byteplay
.
Đó không phải là cách hoạt động của phạm vi. Bạn yêu cầu truy cập một phạm vi trên một stackframe khác nhau. Nó sẽ được ** rất ** khó hiểu nếu phạm vi sẽ cho phép những gì bạn cố gắng ở đây, suy nghĩ của đệ quy đuôi được viết lại thành vòng lặp. Vì vậy, tối ưu hóa mã đột nhiên sẽ thay đổi ý nghĩa của một chương trình, điều này sẽ không bao giờ xảy ra. – Tino