Helpex - Trao đổi & giúp đỡ Đăng nhập
21

Mã sau (không trực tiếp trong trình thông dịch, nhưng thực thi dưới dạng tệp)

def top(deck):
    pass

def b():
    global deck

tạo ra lỗi

SyntaxError: name 'deck' is local and global

trên python2.6.4 và

SyntaxError: name 'deck' is parameter and global

trên python 3.1

python2.4 dường như chấp nhận mã này, trình thông dịch tương tác 2.6.4 cũng vậy.

Điều này đã là kỳ quặc; tại sao 'bộ bài' lại xung đột nếu nó là toàn cục trong một phương thức và một tham số trong phương thức kia?

Nhưng nó trở nên kỳ lạ hơn. Đổi tên 'top' về cơ bản thành bất kỳ thứ gì khác và vấn đề sẽ biến mất.

Ai đó có thể giải thích hành vi này? Tôi cảm thấy như tôi đang thiếu một cái gì đó rất rõ ràng ở đây. Có phải cái tên 'hàng đầu' bằng cách nào đó ảnh hưởng đến một số phạm vi nội bộ không?

Cập nhật

Đây thực sự là một lỗi trong lõi python. Tôi đã nộp một báo cáo lỗi .

21 hữu ích 5 bình luận 4.4k xem chia sẻ
13

Có vẻ như đó là một lỗi trong việc xử lý bảng ký hiệu. Python / symtable.c có một số mã (mặc dù hơi khó hiểu) thực sự coi 'top' như một mã định danh đặc biệt:

if (!GET_IDENTIFIER(top) ||
    !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0)) {
    PySymtable_Free(st);
    return NULL;
}

theo sau đó là:

if (name == GET_IDENTIFIER(top))
    st->st_global = st->st_cur->ste_symbols;

Tiếp tục lên tệp có một macro:

#define GET_IDENTIFIER(VAR) \
    ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR)))

trong đó sử dụng bộ tiền xử lý C để khởi tạo biến topthành một chuỗi xen kẽ với tên của biến.

Tôi nghĩ rằng bảng ký hiệu phải sử dụng tên 'top' để chỉ mã cấp cao nhất, nhưng tại sao nó không sử dụng thứ gì đó không thể xung đột với một biến thực, tôi không biết.

Tôi sẽ báo cáo nó là một lỗi nếu tôi là bạn.

13 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading