0

在这段代码中,编写了一个函数调用,但在定义其变量之一后执行,不会引发错误。

不适用

counter= 0
pub = None

def callback_receive_number_data(msg):
    global counter
    counter += msg.data
    new_msg = Int64()
    new_msg.data = counter
    pub.publish(new_msg)

sub = rospy.Subscriber('/number', Int64, callback_receive_number_data)
pub = rospy.Publisher('/number_count', Int64, queue_size=10)
4

1 回答 1

0

让我们尝试一段具有类似行为的更简单的代码:

pub = None

def func():
    return pub

pub = "thing"
func()  # returns "thing"

您可能希望func返回None,因为这是定义pub时的值func。但 Python 实际上是这样处理代码的:

  1. 在模块命名空间中创建一个名为“pub”的变量,并为其赋值None
  2. 在模块命名空间中创建一个名为“func”的变量,并使其指向一个函数代码块。功能代码是执行以下操作的脚本:
    • 在模块命名空间中找到名为“pub”的变量
    • 获取这个变量的值
    • 返回那个值
  3. 将值“thing”分配给模块命名空间中名为“pub”的变量
  4. 在模块命名空间中查找“func”变量,并调用它指向的代码。

这里要注意的重要一点是,第 2 步不会对 的当前值做任何事情pub。它只是定义了一个函数,它将(最终)查找pub并使用它的值做一些事情。pub当 Python 进入第 2 步时,甚至不需要定义。

当 Python 进入第 4 步时,也就是func(在第 2 步中定义)中的代码实际执行的时候。此时,该函数(第一次)pub在模块命名空间中查找变量。然后它检索该值并使用它。由于这发生在第 3 步之后,该函数发现它pub的值为“thing”。

我想这里的关键思想是该def语句只是创建一个作为抽象代码块的函数。它不查找模块变量的当前值并将它们附加到函数。相反,函数本身会查找这些变量并在稍后调用时检索它们的值。

于 2019-04-19T00:49:34.627 回答