- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为了回答aquestion posted here on SO而玩示例,发现很难理解python的nhập khẩu *
破坏作用域的机制。
首先是一点上下文:这个问题不涉及实际问题;我很清楚from foo import *
是不受欢迎的(这是正确的),而且我明白,这是因为代码中的原因比清晰性更深。我在这里的兴趣是理解导致循环不良行为的机制。换句话说,我理解观察到的行为是预期的;我不明白为什么。
我无法理解的情况是,当使用导入模块(nhập khẩu *
)引用导入模块(b
)时出现的问题。当导入模块使用Một
或不使用*
时,我设法观察到行为上的细微差异,但总体(不良)行为是相同的。我找不到任何明确的解释,无论是在文件中还是在这样。
通过对作用域上可用内容的调查,我构建了一个小示例,根据上述问题和我在SO和其他地方进行的一些搜索,说明了其内容的差异。我尽量简洁地演示。下面的所有代码和实验都是用Python2.7.8完成的。
工作场景
首先是包含包含一个类的平凡模块的平凡模块,*
:
class A:
vượt qua
a.py
:
from pprint import pprint
def dump_frame(offset=0):
nhập khẩu hệ thống
frame = sys._getframe(1+offset)
d = frame.f_globals
d.update(frame.f_locals)
return d
print 'before import v1'
pprint (dump_frame())
import a
print 'after import v1'
pprint (dump_frame())
print a.A()
b_v1.py
,
*
:
from pprint import pprint
def dump_frame(offset=0):
nhập khẩu hệ thống
frame = sys._getframe(1+offset)
d = frame.f_globals
d.update(frame.f_locals)
return d
print 'before import v2'
pprint (dump_frame())
from a import *
print 'after import v2'
pprint (dump_frame())
print A()
Một
Và
b_v2.py
会产生相同的输出,并且两者都能够按预期实例化。然而,正如预期的那样,在进口之后,它们又有所不同。我强调了区别:
b_v1
,在范围内
'a':
b_v2
没有,但是
'A':
b_v1.py
của
b_v2.py
.
__builtins__
.
以包含对
MỘT
的循环引用时(在
a.py
Và
b
变体中)。
from b_v1 import *
class A:
vượt qua
b_v1
的情况;显然,在
b_v2
的情况下,导入是针对这个模块的,而不是针对
a.py
)
a.py
之前,
b_v2.py
与上述情况相似。但是,在导入之后,它被更改并包含
b_v1.py
出现两次。我可以理解这是导入的结果,如果代码在函数中,则可能不会发生这种情况。
Một
中,模块
__builtins__
出现在范围中;它出现在variant
dict
ở giữa.
__builtins__
的实例化都失败。考虑到在variant
b_v2
中,该模块存在于作用域中(因此,我假设已成功导入),我本来希望能够实例化
Một
。事实并非如此。但也有区别:在
b_v1
情况下,它以
MỘT
失败,而对于
b_v1
,失败是a
MỘT
。在后一种情况下,无论我是否尝试实例化为
b_v1.py
(如工作示例中所示)的
AttributeError: 'module' object has no attribute 'A'
,它总是相同的错误。
b_v2.py
,尽管模块在作用域中?
1 Câu trả lời
Python模块自上而下执行。导入语句和其他语句一样是可执行的。当import语句运行时,它会执行以下操作(为了便于说明,请参阅language reference以了解详细信息):
检查模块是否在sys.modules
中列出。如果是,请立即归还
查找模块(通常但不总是通过搜索文件系统)。
hiện hữusys.modules
中为模块创建一个空条目,名称空间为空。
在新创建的命名空间中自上而下执行模块。
假设我们有这样的文件:a.py
:
from b import *
foo = object()
b.py
:
from a import *
print(repr(foo))
a.py
首先被导入。让我们一行一行地看一下:
Một
。在我们开始执行之前,对
Một
的引用存储在
sys.modules['a']
ở giữa.
a.py
chạy
from b import *
。这将转换为“
import b
,然后将
b
命名空间中的所有内容获取到
Một
命名空间中。”
sys.modules['b']
b.py
chạy
from a import *
。Python导入
Một
.
Một
以来,立即导入
sys.modules['a']
返回。
a.py
尚未执行
foo = object()
,
a.foo
尚未存在,因此不能倾倒到
b
命名空间中。
b.py
在上崩溃。
关于python - 在循环引用下理解python的import *机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551513/
Tôi mới làm quen với PHP. Tôi luôn sử dụng vòng lặp for, vòng lặp while và vòng lặp foreach trong các tập lệnh của mình. Tôi muốn biết loại nào hoạt động tốt hơn? Tiêu chí để lựa chọn một chu kỳ là gì? Chúng ta nên sử dụng lệnh nào khi có một vòng lặp bên trong một vòng lặp khác? Tôi luôn muốn biết
Tôi đang học lớp lập trình ở trường trung học và bài tập của tôi là tạo ra một máy tính tổng cơ bản và máy tính bỏ túi, nhưng tôi làm việc trong một nhà hàng nên nếu tạo ra một máy tính như vậy, bạn chỉ có thể tính được một loại thực phẩm. Vì vậy, tôi đang cố gắng làm sao để nó có thể tiếp nhận nhiều loại thực phẩm và thêm chúng vào một biến giá. Xin lỗi nếu một số mã
Đây là sách giáo khoa tôi đang học. var ingredients = ["trứng", "sữa", "bột mì", "đường", "muối nở", "bột nở",
Tôi đang trích xuất số từ một chuỗi và truyền nó vào một hàm. Tôi muốn thêm 1 vào đó rồi trả về chuỗi trong khi vẫn giữ nguyên các số 0 ở đầu. Tôi có thể làm điều này bằng vòng lặp while, nhưng không thể bằng vòng lặp for. Vòng lặp for chỉ bỏ qua số không. thêm var
CHỈNH SỬA: Tôi đã chỉnh sửa kết quả của chương trình. Chương trình yêu cầu ước tính giá trị mu nhất định. Người dùng cung cấp giá trị mu và cũng cung cấp bốn số khác nhau không bằng 1 (gọi là w, x, y, z). Chương trình sau đó cố gắng tìm
Tôi đang viết một thuật toán thực hiện một vòng lặp lớn trên một mảng số nguyên từ đầu đến cuối, kèm theo điều kiện if. Lần đầu tiên điều kiện sai, vòng lặp có thể kết thúc. Vì vậy, đối với vòng lặp for, nếu điều kiện là sai, nó sẽ tiếp tục lặp lại và thực hiện một thay đổi biến đơn giản
Bây giờ tôi đã quen với việc lập trình với bộ nhớ rất hạn chế, nhưng có một câu hỏi mà tôi không có câu trả lời là: phương thức nào tiết kiệm bộ nhớ hơn; for(;;) hay while()? Hay chúng có thể thay thế cho nhau được? Cũng bình luận về các vấn đề hiệu quả nếu có! Câu trả lời hay nhất
Câu hỏi này đã có câu trả lời: Làm thế nào để so sánh các chuỗi trong Java? (23 câu trả lời) Đã đóng 8 năm trước. Tôi đang cố gắng tạo một chương trình nhỏ để tôi có thể đọc các từ cho chương trình. Nếu từ có 6
Câu hỏi này đã có câu trả lời ở đây: python: lỗi danh sách chỉ mục nằm ngoài phạm vi khi lặp lại việc bật các phần tử (12 câu trả lời)
Tôi đang cố gắng yêu cầu người dùng nhập một số nguyên từ 4 đến 10. Nếu họ trả lời ngoài phạm vi đó, hệ thống sẽ lặp lại. Khi người dùng nhập số đúng lần đầu tiên, chương trình không dừng và tiếp tục thực thi câu lệnh else. Nếu người dùng nhập số chính xác vào câu lệnh else, nó sẽ là
Tôi thử tạo một danh sách bằng vòng lặp foreach lồng nhau. Vòng lặp đầu tiên lặp qua một số con số, vòng lặp thứ hai lặp qua ngày tháng. Tôi muốn viết một con số cho một ngày. Vì vậy, có một chức năng khác để kiểm tra nó. Nhưng kết quả là con số đó được viết nhiều lần vào ngày tháng. Out thì như thế này:
Điều tôi muốn làm là tạo một mảng bằng vòng lặp rồi gọi mảng đó trong một lớp khác, việc mà tôi sẽ không làm và có lẽ sẽ không bao giờ làm. Cách tốt nhất để giải quyết vấn đề này là gì? Tôi đã tìm kiếm tất cả các giải pháp nhưng chúng không biên dịch được. Cảm ơn sự giúp đỡ của bạn. nhập khẩu ja
Tôi thử tạo một danh sách bằng vòng lặp foreach lồng nhau. Vòng lặp đầu tiên lặp qua một số con số, vòng lặp thứ hai lặp qua ngày tháng. Tôi muốn viết một con số cho một ngày. Vì vậy, có một chức năng khác để kiểm tra nó. Nhưng kết quả là con số đó được viết nhiều lần vào ngày tháng. Out thì như thế này:
Tôi đang mô phỏng một nhà hàng thức ăn nhanh trong hơn ba giờ. Ba giờ được chia thành 18 khoảng thời gian, mỗi khoảng dài 600 giây. Mỗi khoảng thời gian sẽ in ra số liệu thống kê về những gì đã xảy ra trong 600 giây đó. Cấu trúc ban đầu của tôi là: int i; for (i=0;
Câu hỏi này đã có câu trả lời: IE8 for...in enumerator (3 câu trả lời) Làm thế nào để kiểm tra xem một đối tượng có thuộc tính cụ thể trong J không
Loại nào có hiệu suất tốt hơn? Điều này có thể không phù hợp với các ngôn ngữ lập trình khác, vì vậy vui lòng giải thích nếu chúng khác nhau hoặc nếu bạn có thể trả lời câu hỏi của tôi bằng kiến thức của bạn về một ngôn ngữ cụ thể. Tôi sẽ sử dụng C++ làm ví dụ, nhưng tôi muốn biết nó hoạt động như thế nào trong Java, C hoặc bất kỳ ngôn ngữ chính thống nào khác.
Câu hỏi này khó có thể giúp ích cho bất kỳ du khách nào trong tương lai; nó chỉ liên quan đến một khu vực địa lý nhỏ, một thời điểm cụ thể hoặc một tình huống rất hẹp không áp dụng chung cho toàn bộ đối tượng sử dụng Internet. Để giúp câu hỏi này có thể áp dụng rộng rãi hơn, hãy truy cập
Tôi mới làm quen với lập trình C và đang viết mã để xác định phân tích thừa số nguyên tố của M trường hợp thử nghiệm. Bản thân chức năng này hoạt động tốt nếu tôi chỉ quét một lần, nhưng lại thất bại thảm hại khi tôi thử quét M lần. Tôi không biết tại sao vòng lặp scanf() lại có vấn đề. TRONG
Câu hỏi này đã có câu trả lời: JavaScript theo tham chiếu so với theo giá trị [trùng lặp] (4 câu trả lời) Đã đóng 3 năm trước. Tôi đang gặp sự cố khi sử dụng TSlint và
Tôi đã thử thêm vòng lặp foreach hoặc for vào mã bên dưới để tạo nhiều tập dữ liệu cho Charts.js. Điều này sẽ cho phép tôi tạo nhiều đường trên biểu đồ đường này. Tôi có một đối tượng PHP mà tôi có thể mã hóa để điền vào các biến sau này, nhưng
Tôi là một lập trình viên xuất sắc, rất giỏi!