- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”:
globalVar = 1
toDelete = 2
class Test(object):
classVar = 3
def runTest1(self):
print globalVar
print toDelete
print missingVar
def runTest2(self):
print self.classVar
print toCreate
print missingVar
然后在交互式 shell 中我这样做:
>>> import test
>>> tester = test.Test()
>>> tester.runTest1()
1
2
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 10, in runTest1
print missingVar
NameError: global name 'missingVar' is not defined
>>> tester.runTest2()
3
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 14, in runTest2
print toCreate
NameError: global name 'toCreate' is not defined
没什么奇怪的。然后我将“test.py”的前几行更改为:
globalVar = 4
toCreate = 5
class Test(object):
classVar = 6
现在回到交互式 shell:
>>> reload(test) # test = reload(test) gives the same result
>>> tester.runTest1()
4
2
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 10, in runTest1
print missingVar
NameError: global name 'missingVar' is not defined
>>> tester.runTest2()
3
5
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 15, in runTest2
print missingVar
NameError: global name 'missingVar' is not defined
>>> dir(test)
['Test', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'globalVar', 'toCreate', 'toDelete']
Vì thế tester
现在知道 toCreate
,它在 tester
本身被创建之后出现。它仍然知道 toDelete
,因为重新加载模块显然不会影响已删除的全局变量。转折点来了:
>>> import sys
>>> import importlib
>>> del(sys.modules['test']) # remove cached version
>>> test = importlib.import_module('test') # same result if I don't have 'test = '
>>> tester.runTest1()
Không có
Không có
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 10, in runTest1
print missingVar
NameError: global name 'missingVar' is not defined
>>> tester.runTest2()
3
Không có
Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
Tệp "", dòng 1, trong
File "test.py", line 15, in runTest2
print missingVar
NameError: global name 'missingVar' is not defined
>>> dir(test)
['Test', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'globalVar', 'toCreate']
từ sys.modules
中删除模块,然后重新导入模块会导致所有全局变量变为 Không có
.
同样有趣的是,如果我删除 Bài kiểm tra
Và sys.modules['test']
,它仍然会暂时知道变量的值。片刻之后(我假设这是模块被垃圾回收所花费的时间),值变为 Không có
。重新导入模块会导致垃圾收集(或任何正在发生的事情)立即发生。
那么 tester
如何找到正在创建的新全局变量,然后一旦模块消失,为什么它仍然知道存在哪些变量,即使它不再知道它们持有什么值?
1 Câu trả lời
任何非本地名称(在当前范围内尚未分配)都被假定为全局名称。每次代码运行时都会查找该名称。
因此在运行时 名称在全局命名空间中查找,它只是一个字典。如果该名称当时不存在,则会引发 NameError
异常。
反汇编函数时可以看到这一点;使用 dis
mô-đun 时显示字节码:
>>> import dis
>>> def foo():
... bar = 'baz' # local
... bar # reference the local
... baz # reference something else; e.g. a global
...
>>> dis.dis(foo)
2 0 LOAD_CONST 1 ('baz')
3 STORE_FAST 0 (bar)
3 6 LOAD_FAST 0 (bar)
9 POP_TOP
4 10 LOAD_GLOBAL 0 (baz)
13 POP_TOP
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
thanh
是局部的(它被分配到 block 中),而 baz
是全局的。局部由 LOAD_FAST
引用,而全局由 LOAD_GLOBAL
引用。
为此,函数对象有一个 function.__globals__
引用,将其链接到模块全局映射;请参阅 datamodel documentation TRONG用户定义函数部分:
>>> foo.__globals__ is globals()
ĐÚNG VẬY
Python 还在删除模块时清理全局变量;为了防止循环引用阻碍最终确定全局变量在那个时候被反弹到 Không có
(尽管这种行为 changed in Python 3.4 )。但是,如果您维护对 tester
的引用,您的代码将找到那些 Không có
giá trị.
Của bạn tester
实例仍然引用原始类及其方法,仍然通过它们的 function.__globals__
引用来引用它们的模块。因此,尽管您删除了对模块的 sys.modules
引用,触发了模块清理,但 globals 字典 仍被类方法引用。这个全局字典现在包含每个全局的 Không có
giá trị.
关于Python 内部 - 对象如何知道全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24020108/
Một trong những giáo sư của tôi đã đưa cho chúng tôi một số câu hỏi thực hành cho một kỳ thi và một trong những câu hỏi đó giống như thế này (mã giả): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
Tôi có vẻ sử dụng bài kiểm tra này rất nhiều if( object && object !== "null" && object !== "undefined" ){ doSomething(); } trên một đối tượng, tôi
C# Object/object là kiểu giá trị hay kiểu tham chiếu? Tôi đã kiểm tra rằng họ có thể giữ tham chiếu, nhưng tham chiếu này không thể được sử dụng để thay đổi đối tượng. sử dụng System; lớp MyClass { public static
Tôi đang gặp sự cố khi gửi json qua AJAX. var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
Khi tôi cố truy cập đối tượng {{result}} trong View của mình (mà tôi gửi từ máy chủ Express js), nó chỉ hiển thị [object][object] Có ai biết cách lấy giá trị ở định dạng JSON không? Đây là
Tôi có dữ liệu ở nhiều kiểu khác nhau (có thể là chuỗi, số nguyên...). Sau đây là một ví dụ đơn giản: public static void main(String[] args) { before("one"); }
Xin chào, tôi mới làm quen với json và javascript. Tôi tìm thấy phương pháp sử dụng dữ liệu json làm bảng trên trang web này. Tôi tò mò tại sao khi tôi thử sử dụng dữ liệu json làm bảng, tôi lại nhận được [Object,Object]
Đã đóng. Sự cố này cần có thông tin chi tiết để gỡ lỗi. Hiện tại không chấp nhận câu trả lời. Chỉnh sửa câu hỏi để bao gồm hành vi mong muốn, một vấn đề hoặc lỗi cụ thể và
Tôi nghe người khác nói null == object tốt hơn object == null kiểm tra Ví dụ: void m1(Object obj ) { if(null == obj) // Đây có phải là
Đối tượng Match cung cấp quyền truy cập vào các thuộc tính chỉ đọc của một biểu thức chính quy khớp. Mô tả Đối tượng Match chỉ có thể được tạo thông qua phương thức Execute của đối tượng RegExp, phương thức này thực sự trả về một tập hợp các đối tượng Match. Tất cả
Đối tượng lớp Đối tượng được tạo bằng cách sử dụng câu lệnh Class. Cung cấp quyền truy cập vào nhiều sự kiện khác nhau của lớp học. Mô tả: Không được phép khai báo rõ ràng một biến là kiểu Class. Trong bối cảnh của VBScript, thuật ngữ "đối tượng lớp" đề cập đến một
Đối tượng Folder cung cấp quyền truy cập vào tất cả các thuộc tính của một thư mục. Đoạn mã sau minh họa cách lấy đối tượng Thư mục và xem các thuộc tính của nó: Hàm ShowDateCreated(f
Đối tượng File cung cấp quyền truy cập vào tất cả các thuộc tính của một tệp. Đoạn mã sau minh họa cách lấy đối tượng File và xem các thuộc tính của nó: Hàm ShowDateCreated(fil
Đối tượng Drive cung cấp quyền truy cập vào các thuộc tính của ổ đĩa hoặc chia sẻ mạng. Mô tả Mã sau đây minh họa cách sử dụng đối tượng Drive để truy cập các thuộc tính của ổ đĩa: Hàm ShowFreeSpac
Đối tượng FileSystemObject cung cấp quyền truy cập vào hệ thống tập tin của máy tính. Đoạn mã sau minh họa cách sử dụng đối tượng FileSystemObject để trả về đối tượng TextStream có thể đọc được.
Tôi mới làm quen với JavaScript OOP và tôi nghĩ đây là một câu hỏi khá cơ bản nhưng tôi không thể tìm thấy bất kỳ sự trợ giúp nào khi tìm kiếm trên web. Tôi có bỏ lỡ điều gì không, hay tôi đang làm sai cách? Đây là mã mẫu của tôi: functionio
Tôi có thể dễ dàng tạo ra nhiều đồ vật khác nhau. Ví dụ như thế này: var myObject = { myFunction: function () { return ""; } };
hàm Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = hàm()
Có ai có thể giải thích cho tôi tại sao đoạn mã sau lại trả về (object, Object) không? (console.log(dope) cung cấp những gì nó cần, nhưng trong JSON.stringify và JSON.parse
Tôi đang cố gắng hoàn thành bài tập biểu đồ phân tán từ trại mã miễn phí. Tuy nhiên, tôi mới chỉ tự học d3 được vài giờ và sau khi làm theo hướng dẫn từ lynda.com, tôi đã cố gắng xác định cách hiển thị dữ liệu cụ thể trong chú giải công cụ. Mã này
Tôi là một lập trình viên xuất sắc, rất giỏi!