我本小人txt,50 shades of grey,4399小游戏h
前言
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:风,又奈何
ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/a6zvjdun
背景:一条微博问题:
首先,我们比较熟悉的函数传参的两种方式是:
典型的传值、传引用方式如 c 语言,c 语言中的变量 hold 住了一块内存区域。
而 python 对变量的处理有很大不同。此外,python 中的函数参数传递是遵循极具 python 土味的 call-by-object(传递对象),也有叫 call-by-object-reference 的(传递对象的引用,或传对象的地址指向),不是 c 传统思维里的传值或传引用。
且听慢慢道来。
首先,python 中一切皆对象,是的,数字、列表、字典等等啥都是对象。其次,python 的变量充其量就是对象的一个引用,变量赋值操作 = 其实是把一个名字绑定到对象上,通俗语气讲,变量就是一个标签,一个名字,仅此而已,不像 c 语言那样:
a = 5 # a 是对象 5 的一个引用,a 是 5 的一个名字、标签
b = 5 # b 是对象 5 的又一个引用,b 是 5 的又一个名字、标签
# 看看以下的 id 值吧,都是 140732178864064(类似这样的数字):
id(a) # 140732178864064
id(b) # 140732178864064
id(5) # 140732178864064
上述代码说明了 a、b 都不是个事儿,它们只是个标签记号,辅助你记住 5 这个对象,5 这个对象才是主角。
来看一个函数:
a = 5
def test(p):
p = 10
print(p, "in test.")
test(a)
print(a)
# 结果:
10 in test.
5
来解释:
就这么简单。
再来看看本道题目中的例子:
def f(x=[]):
x.append(1)
return x
print(f(), f())
————— 补充 —————
有人问:传统函数内部的局部变量是存在栈上,函数退出后就会销毁,为啥x没有被销毁?
函数是对象,def 时就构建了,默认参数作为属性也相应初始化(提示:f.__defaults__),而默认参数值 list 对象一直伴随着函数对象存在。这里每次都是返回同个函数对象的这个 list 对象的地址指向(跟传参一样),在打印时才取出 list 值,但这时 list 值已经是第二次 f() 后的值了。甚至你还可以比如这样看看:
f()
print(f.__defaults__[0])
f()
print(f.__defaults__[0])
python 一切皆对象可不是闹着玩的,谁说 python 简单了?
如果想了解更多关于python的应用,可以私信小编
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论