python通过引用传递

时间:2017-03-08 16:49:55

标签: python python-2.7 pass-by-reference

当我做这样的事情时,今天发生了奇怪的事情:

a = np.array([1, 2, 3])

b = a

b[0] = 0

print a, b

然后价值似乎通过参考传递!答案是:

result: [0 2 3] [0 2 3]

但通常我认为python中的变量是按值传递的,如下所示:

a = np.array([1, 2, 3])

b = a

b = np.array([0, 2, 3])

print a, b

然后答案就变成了:

result: [1 2 3] [0 2 3]

但为什么会这样呢?如何判断变量是通过引用还是值传递?有人说这是因为可变对象,但我还是不太明白。所以你能帮我解释一下吗?非常感谢!

2 个答案:

答案 0 :(得分:3)

因为它没有与NumPy直接相关的任何内容,所以我们将其重写为:

a = [1, 2, 3]

b = a

b = [0, 2, 3]

print a, b

关键是名称和价值观是分开的。所以在第一行:

a = [1, 2, 3]

您创建一个列表并将其分配给a

现在在下一行,您将a分配给b。仍然只有一个列表,两个名称都只是引用它。

接下来,您创建一个新列表并将其分配给b。现在b引用新列表而不是列表。现在只有1个名称(a)引用另一个名称,而不是2个名称。

因此,如果我们采取第一个例子,你在哪里:

b[0] = 0

ab都引用相同的列表,因此可以从两个名称中观察到更改,因为两个名称都引用相同的列表。

答案 1 :(得分:1)

Python中的变量赋值始终是赋值给引用。换句话说,在Python中,变量是名称,而赋值变量则声明某个名称。

using namespace octomap;

void cloud_cb(const moveit_msgs::PlanningScenePtr& input)
{
// Extracting the MoveIt! planning scene world published by /move_group
moveit_msgs::PlanningScene::Ptr my_planning_scene(new moveit_msgs::PlanningScene);
*my_planning_scene = *input;
moveit_msgs::PlanningSceneWorld my_world = (*my_planning_scene).world;

// Extracting only the OctoMap
octomap_msgs::OctomapWithPose octomap_pose = my_world.octomap;
octomap_msgs::Octomap octomap = octomap_pose.octomap;

// Conversion from octomap_msgs to octomap
AbstractOcTree* my_abstract_map = octomap_msgs::msgToMap(octomap);

// Obtaining the actual OctoMap tree
OcTree* my_map = (OcTree*)my_abstract_map;
OcTree tree = *my_map;

tree.writeBinary("my_tree.bt"); //if you want to save the OcTree in a file
}

这意味着让connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray)), this, SLOT(on_characteristicChanged(QLowEnergyCharacteristic, QByteArray))); 成为第一个数组的名称,然后让a = np.array([1, 2, 3]) b = a b[0] = 0 print a, b 成为a的名称,但b表示第一个数组,所以我们真的& #39;只是说让a也是第一个数组的名称。然后a表示更改数组的第一个元素。然后,当您打印bb[0] = 0时,您将打印相同的内容两次(数组),因为ab是相同内容的名称。

a

前两行与上次相同。 b是数组的名称,a = np.array([1, 2, 3]) b = a b = np.array([0, 2, 3]) print a, b 也是。然后a表示b现在是此新数组的名称。因此,当您打印b = np.array([0, 2, 3])b时,您正在打印a,它仍然是第一个数组的名称,而b是第二个数组的名称。

相关问题