作者jasonhsu14 (14号星期五的杰森)
看板Python
标题[问题] def函式之输入变数会随函式内容改变
时间Thu Jul 16 09:55:26 2020
各位前辈好
小弟有一个新手级问题
先上程式码
def xxx(d):
d[0]=123
return d
a=[1,2]
b=xxx(a)
在程式码中,我设定变数a为[1,2]
但将a丢到def中,得到b的同时,a也会随之改变
想请问造成这个现象的原因
是否为 a是一个全域变数,而在函式中的d是a的shallow copy所致?
若不是的话,还盼望版友们能指导小弟造成此现象的原因为何
先谢谢版友拨空阅读我的疑问
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 211.22.64.145 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1594864528.A.97D.html
1F:→ IAMPF: 因为你是送了reference过去 07/16 09:59
2F:推 TitanEric: python是call by object list相当於传reference 07/16 10:16
先谢谢版友们的回答,刚刚也google後才大致了解
pass by reference跟pass by value之别
所以看起来python是根据不同情况去pass value或reference罗?
那解决之道就是在函式内又在设一个变数吗?
以上例来说,应修正为
def xxx(d):
y=d
y[0]=123
return y
※ 编辑: jasonhsu14 (211.22.64.145 台湾), 07/16/2020 10:23:52
※ 编辑: jasonhsu14 (211.22.64.145 台湾), 07/16/2020 10:26:31
3F:推 s0914714: 要改成y=d[:] 一般来说要传list会写成 def xxx(d=None): 07/16 10:52
4F:→ kenduest: 用 y=d[:] 复制一份,或是你要用 y=copy.copy(d) 07/16 10:52
5F:→ s0914714: 函式里面判断if not d成立 d = [] 07/16 10:53
6F:推 bugbug777: shalow/deep copy, reference 07/16 10:55
7F:→ as30385438: python中alway是pass by pointer,不会有不同情况 07/18 01:27