台州做网站电话,淘宝网页版入口官网,wordpress安装后慢的不行,承德网站建设价格C这样的语言用多了之后#xff0c;在Python函数传递参数的时候#xff0c;经常会遇到一个问题#xff0c;我要传递一个引用怎么办#xff1f; 比如我们想要传一个x到函数中做个运算改变x的值#xff1a;
def change(y):y 1x 1
print (before change:, x)
…C这样的语言用多了之后在Python函数传递参数的时候经常会遇到一个问题我要传递一个引用怎么办 比如我们想要传一个x到函数中做个运算改变x的值
def change(y):y 1x 1
print (before change:, x)
change(x)
print (after change: , x)
得到的结果是
before change: 1
after change: 1
完全没用~~~这是怎么回事 我来说明一下这个过程~ 也就是说python中的等号就是把变量指向了一个实例而已。 那么如何做到其它语言中引用这样的效果呢一个比较推荐的方法就是用把参数return回去就可以了如下面代码所示。def change(y):y 1return yx 1
print (before change:, x)
x change(x)
print (after change: , x)
结果为
before change: 1
after change: 2
另一种方法就是我们不让函数中的参数指向新的地址不就可以了我们让它在原来的地址上修改我们的值。这一点只有一部分的数据类型可以做到我们把这样的对象叫做可变对象做不到的就叫不可变对象。
不可变对象intstringfloattuple 等可变对象 listdictionary 等
举几个例子更为通俗易懂
def change(x):print (before append:, x, id:, id(x))x.append(0)print (after append:, x, id:, id(x))x [1, 2, 3]
print (before change:, x, id:, id(x))
change(x)
print (after change:, x, id:, id(x))
before change: [1, 2, 3] id: 140623459512008
before append: [1, 2, 3] id: 140623459512008
after append: [1, 2, 3, 0] id: 140623459512008
after change: [1, 2, 3, 0] id: 140623459512008
由于list在做append操作时x指向的地址是不变的所以可以有引用的效果x[0] 4这样的操作也是没问题的 然而如果是把x指向了新的地址就不行了如下
def change(x):print (before equal:, x, id:, id(x))x [5]print (after equal:, x, id:, id(x))x [1, 2, 3]
print (before change:, x, id:, id(x))
change(x)
print (after change:, x, id:, id(x))
before change: [1, 2, 3] id: 139683058095432
before equal: [1, 2, 3] id: 139683058095432
after equal: [5] id: 139683058028360
after change: [1, 2, 3] id: 139683058095432
这下应该就搞清楚是怎么回事了吧不过正是因为python的这种特性在函数设置默认参数的时候我们要注意尽量不用可变对象当默认值否则会发生下面这种情况
def change(x[]):x.append(1)return xprint (change())
print (change())
[1]
[1, 1]
比较妥当的做法是用不可变对象来代替[]比如None
def change(xNone):if not x:x []x.append(1)return xprint (change())
print (change())
此时的输出为
[1]
[1]