python函数实参不是的作用域问题,高手来解释下下面的输出?

deff(x,l=[]):foriinrange(x):l.append(i*i)print(l)f(2)f(3,[3,2,1])f(3)#为什么输出0,1,0,1,4... def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)

f(2)
f(3,[3,2,1])
f(3) #为什么输出0,1,0,1,4
展开
 我来答
山来缥缈山
2018-05-11
知道答主
回答量:1
采纳率:0%
帮助的人:1.4万
展开全部
可以先不看f(3,[3,2,1]),这个就是来迷惑人的,光看f(2),f(3),Python函数在定义的时候,默认参数L,它指向一个对象[ ],这个对象是和函数同生同死的,每次调用该函数,都会默认指向[ ] ,除非传递了第二个参数,则改变了L的指向,但是如果前面修改了这个对象,所以也会在后面体现出来,因为他是一个默认指向的对象。所以,定义默认参数要牢记一点:默认参数必须指向不变对象!
次寻冬Xd
2017-09-19 · TA获得超过719个赞
知道小有建树答主
回答量:1123
采纳率:18%
帮助的人:168万
展开全部
Python中函数的参数传递问题,函数参数的传递往往是一个难以理解的概念,一个经典的例子如下所示:
int swap(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;

return 0;
}

int a = 10,b = 20;
printf("Before Swap a = %d, b = %d\n",a,b);
swap(a,b);
printf("After Swap a= %d,b = %d\n",a,b);
参数是采用值传递的形式,存在形参与实参的区别,也就是将实参的值复制给形参,在函数内部操作的都只是形参的内容,并不改变实参的值,所以变量在操作过后并没有发生改变。
参数传递过程中存在两个规则:
1、通过引用将参数复制到局部作用域的对象中,意味着被用来访问函数参数的变量于提高给函数的对象无关,因为存在一个复制问题,这和C语言是相同的。而且修改局部对象不会改变原始数据。
2、可以在适当位置修改可变对象。可变对象主要就是列表和字典,这个适当位置实质上就是前面分析的局部子对象的修改不会改变字典对象或者列表对象的ID位置。
追问
你把C语言换成了python?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式