我有一点点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参数传递如何工作?我刚刚说的是什么不正确的逻辑?任何明确而简单的外行解释都将不胜感激。
//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
}
内部主要: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
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)
内部主要: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
感谢。
答案 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参数通过赋值传递。这里有很好的解释 -
答案 2 :(得分:0)
&#34;通过引用传递&#34;表示函数接收调用者变量的地址,当它分配给参数时,它会修改调用者的变量。
在C ++中,必须在函数中显式指定,方法是在函数声明中将&
放在参数名之前。否则,参数按值传递(尽管在数组的情况下,数组名称衰减为指向其第一个元素的指针,因此它类似于通过引用传递)。
Python根本不会这样做,它使用pass by value。但是,如果值是类似于列表或字典的结构化对象,则该值是对对象的引用,而不是对象的副本。因此,如果函数修改了对象的内容,它也会影响调用者的变量。但它与通过引用传递不一样,因为如果函数只是分配给参数变量,它对调用者的变量没有影响。
对于诸如数字和字符串之类的不可变值,这根本不会发生。没有办法修改这些值的内容。您所能做的就是分配给变量,如上所述,这对调用者的变量没有影响。