You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python线程创建时target函数省略括号的原因及加括号的影响

Python线程target参数:为什么函数要省略括号?

嘿,这个问题戳中了很多Python线程新手的盲区,我来给你讲得明明白白:

为什么指定target时check_values要省略括号?

threading.Thread的target参数要求传入的是一个可调用对象(callable)——说白了就是函数本身,而不是函数执行后的结果。

当你写check_values的时候,你传递的是这个函数的引用,线程启动后会自己去调用这个函数。但如果加了括号check_values(),那你是直接在当前代码执行的地方(也就是主线程)调用了这个函数,然后把函数的返回值传给target。这完全不是线程想要的东西!

添加括号会产生什么结果?

分两种情况,但大部分时候都是坑:

  • 如果函数没有返回值(默认返回None):你会先在主线程里执行一遍check_values函数,然后把None传给target。当你调用checking_thread.start()时,会直接抛出TypeError: 'NoneType' object is not callable的错误——因为线程找不到可以执行的函数了。
  • 如果函数返回了另一个可调用对象(比如另一个函数):线程启动后会执行那个返回的对象,但这几乎不是你原本想要的逻辑,而且提前在主线程执行check_values的行为也会打乱你的预期。

举个直观的对比例子:

正确写法(省略括号)

import threading
import time

def check_values():
    time.sleep(1)
    print("我在新线程里执行!")

# 传递函数本身给target
checking_thread = threading.Thread(target=check_values)
checking_thread.start()
print("我是主线程,先跑完啦!")

运行结果会先打印主线程的内容,1秒后打印新线程的内容——符合多线程的预期。

错误写法(加括号)

import threading
import time

def check_values():
    time.sleep(1)
    print("我居然在主线程里执行了...")
    return None

# 立刻在主线程执行check_values,然后把None传给target
checking_thread = threading.Thread(target=check_values())
print("主线程等着呢...")
checking_thread.start()  # 这里会报错!

运行时会先等1秒,打印我居然在主线程里执行了...,然后打印主线程等着呢...,最后抛出TypeError——完全没用到新线程,还报错了。

内容的提问来源于stack exchange,提问作者SomebodyOnEarth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:47:14