C ++与Python

时间:2017-01-20 22:48:12

标签: c++ python-3.x pass-by-reference scoping

我有一点点C ++背景。我目前正在学习Python,并试图了解函数参数的传递方式。我知道这个问题在这里被多次询问,但由于我不是计算机科学专业,很多讨论线程对我来说相当深奥,而且,我没有看到很多关于不同语言之间这个主题的比较,所以我想我会试一试新帖子。

情况是这样的:我的理解是Python只通过引用传递(即传递变量名的值,我相信它是位置地址。)在这种印象下,我回到了我原来的C ++教科书,希望能够刷新我的记忆如何通过引用传递。但后来我发现在C ++中通过引用传递似乎与在Python中通过引用传递不同。一个例子是变量重新分配会影响C ++中的原始变量,但不会影响Python。

以下是我在C ++和Python中的实验的代码和输出。 C ++代码来自D.S.Malik的 C ++编程:从问题分析到程序设计(第6版); Python代码是我对C ++代码的翻译。请注意,C ++示例包含pass-by-value和pass-by-reference。

所以,这里有我的问题:是否通过引用语言特定的定义? Python参数传递如何工作?我刚刚说的是什么不正确的逻辑?任何明确而简单的外行解释都将不胜感激。

C ++代码

//Example 6-13: Reference and value parameters

#include <iostream>

using namespace std;

void funOne(int a, int& b, char v);
void funTwo(int& x, int y, char& w);

int main()
{
    int num1, num2;
    char ch;
    num1 = 10; //Line 1
    num2 = 15; //Line 2
    ch = 'A'; //Line 3
    cout << "Line 4: Inside main: num1 = " << num1
        << ", num2 = " << num2 << ", and ch = "
        << ch << endl; //Line 4
    funOne(num1, num2, ch); //Line 5
    cout << "Line 6: After funOne: num1 = " << num1
        << ", num2 = " << num2 << ", and ch = "
        << ch << endl; //Line 6
    funTwo(num2, 25, ch); //Line 7
    cout << "Line 8: After funTwo: num1 = " << num1
        << ", num2 = " << num2 << ", and ch = "
        << ch << endl; //Line 8
    return 0;
}

void funOne(int a, int& b, char v)
{
    int one;
    one = a; //Line 9
    a++; //Line 10
    b = b * 2; //Line 11
    v = 'B'; //Line 12
    cout << "Line 13: Inside funOne: a = " << a
        << ", b = " << b << ", v = " << v
        << ", and one = " << one << endl; //Line 13
}

void funTwo(int& x, int y, char& w)
{
    x++; //Line 14
    y = y * 2; //Line 15
    w = 'G'; //Line 16
    cout << "Line 17: Inside funTwo: x = " << x
        << ", y = " << y << ", and w = " << w
        << endl; //Line 17
}

C ++输出

  

内部主要:num1 = 10,num2 = 15,ch = A
  在funOne里面:a = 11,b = 30,v = B,一个= 10   在funOne之后:num1 = 10,num2 = 30,并且ch = A
  内部funTwo:x = 31,y = 50,w = G
  在funTwo之后:num1 = 10,num2 = 31,ch = G

Python代码

def funOne (a, b, v):
    one = a
    a += 1
    b = b * 2
    v = 'B'
    print("Inside funOne: a", a, "b", b, "v", v, "one", one)

def funTwo (x, y, w):
    x += 1
    y = y * 2
    w = 'G'
    print("Inside funTwo: x", x, "y", y, "w", w)

num1 = 10
num2 = 15
ch = 'A'

print("Inside main: num1", num1, "num2", num2, "ch", ch)
funOne(num1, num2, ch)
print("After funOne: num1", num1, "num2", num2, "ch", ch)
funTwo(num2, 25, ch)
print("After funTwo: num1", num1, "num2", num2, "ch", ch)

Python输出

  

内部主要:num1 10 num2 15 ch A
  里面的乐趣:一个11 b 30 v B one 10
  在funOne之后:num1 10 num2 15 ch A
  Inside funTwo:x 16 y 50 w G
  在funTwo之后:num1 10 num2 15 ch A

感谢。

3 个答案:

答案 0 :(得分:3)

C ++中与Python引用最接近的是智能指针。事实上,CPython使用类似于std::shared_ptr的引用计数指针。

这个Python函数:

def foo(an_int, a_string, list_of_int):

大致相当于:

variant foo(shared_ptr<const int> an_int, shared_ptr<const string> a_string, shared_ptr<vector<shared_ptr<const int>>> list_of_int) {

答案 1 :(得分:0)

Python参数通过赋值传递。这里有很好的解释 -

How do I pass a variable by reference?

答案 2 :(得分:0)

&#34;通过引用传递&#34;表示函数接收调用者变量的地址,当它分配给参数时,它会修改调用者的变量。

在C ++中,必须在函数中显式指定,方法是在函数声明中将&放在参数名之前。否则,参数按值传递(尽管在数组的情况下,数组名称衰减为指向其第一个元素的指针,因此它类似于通过引用传递)。

Python根本不会这样做,它使用pass by value。但是,如果值是类似于列表或字典的结构化对象,则该值是对对象的引用,而不是对象的副本。因此,如果函数修改了对象的内容,它也会影响调用者的变量。但它与通过引用传递不一样,因为如果函数只是分配给参数变量,它对调用者的变量没有影响。

对于诸如数字和字符串之类的不可变值,这根本不会发生。没有办法修改这些值的内容。您所能做的就是分配给变量,如上所述,这对调用者的变量没有影响。