cache = {}
def func():
cache['foo'] = 'bar'
print cache['foo']
đầu raTại sao từ khóa chung không được yêu cầu trong trường hợp này?
bar
Tại sao công việc này và tại sao nó không đòi hỏi sử dụng các từ khóa global
?
cache = {}
def func():
cache['foo'] = 'bar'
print cache['foo']
đầu raTại sao từ khóa chung không được yêu cầu trong trường hợp này?
bar
Tại sao công việc này và tại sao nó không đòi hỏi sử dụng các từ khóa global
?
Vì bạn không phải là chỉ định đến cache
, thay vào đó bạn đang thay đổi từ điển. cache
vẫn trỏ đến từ điển, do đó bản thân nó không thay đổi. Dòng cache['foo'] = 'bar'
chuyển thành cache.__setitem__('foo', 'bar')
. Nói cách khác, giá trị của cache
là một con trăn dict
và giá trị đó là chính nó có thể thay đổi.
Nếu bạn cố gắng thay đổi những gì cache
đề cập đến bằng cách sử dụng cache = 'bar'
thay vào đó, bạn sẽ được thay đổi những gì cache
điểm đến và sau đó bạn cần từ khóa global
.
Có lẽ câu trả lời cũ hơn của tôi về câu hỏi tương tự sẽ giúp bạn hiểu sự khác biệt: Python list doesn't reflect variable change.
Vì vậy, cách này người ta có thể thách thức toàn bộ quan điểm của việc có từ khóa 'toàn cầu'? –
@BunnyRabbit: Điểm * có từ khóa 'global' là dành cho trình biên dịch python để biết cấu trúc nào cần thay đổi. Hiểu đầy đủ lý do tại sao điều đó là cần thiết đòi hỏi phải delving vào các hoạt động bên trong của Python ('local()' so với 'globals()' và mã byte và như vậy). Không có gì đang bị thách thức ở đây, một ngôn ngữ năng động không phải là cố gắng ngăn cản bạn sửa đổi các hình cầu. :-) –
'toàn cầu' là không bắt buộc đối với các đối tượng có thể thay đổi. –