gpt4 book ai didi

python - 为什么套接字在列表理解中关闭而不是在 for 循环中?

转载 作者:太空狗 更新时间:2023-10-30 00:49:00 25 4
gpt4 key购买 nike

我正在尝试在 Python 中创建可用端口列表。我正在关注 this tutorial ,但我没有打印打开的端口,而是将它们添加到列表中。

最初,我有如下内容:

available_ports = []

try:
for port in range(1,8081):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
available_ports.append(port)
sock.close()

# ...

这显然工作正常,但众所周知 comprehensions are faster than loops , 所以我现在有:

try:
available_ports = [port for port in range(1, 8081) if not socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex((remoteServerIP, port))]

# ...

我假设套接字不会关闭,但我用以下方法对其进行了测试:

try:
available_ports = [port for port in range(1, 8081) if not socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect_ex((remoteServerIP, port))]

for port in range(1,8081):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
print("Port {}: \t Open".format(port))
sock.close()

# ...

确实打印了打开的端口。

为什么套接字在理解中关闭而不是 for 循环?我可以依赖这种行为还是转移注意力?

最佳答案

没有对您打开的套接字留下任何引用,这意味着它们已被垃圾收集。套接字已关闭 as soon as they are garbage collected .

确切地,当您的列表理解中的套接字被垃圾收集时,不同的 Python 实现是不同的。 CPython 使用引用计数,因此一旦最后一个引用被删除就会关闭套接字。其他实现可能会将关闭推迟到下一个 GC 周期。

关于python - 为什么套接字在列表理解中关闭而不是在 for 循环中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com