当我做这样的事情时,今天发生了奇怪的事情:
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]
但为什么会这样呢?如何判断变量是通过引用还是值传递?有人说这是因为可变对象,但我还是不太明白。所以你能帮我解释一下吗?非常感谢!
答案 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
a
和b
都引用相同的列表,因此可以从两个名称中观察到更改,因为两个名称都引用相同的列表。
答案 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
表示更改数组的第一个元素。然后,当您打印b
和b[0] = 0
时,您将打印相同的内容两次(数组),因为a
和b
是相同内容的名称。
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
是第二个数组的名称。